首页 > 解决方案 > 如何最大化和最小化 Swing 中 JPanel 内的 JTable?

问题描述

我正在制作一个 Swing GUI。我不知道如何最大化和最小化 JPanel 内的 JTable。

标签: javaswing

解决方案


从评论编辑

你评论说我想让表格“全屏”。如果你的意思是全屏,容器的大小,你可以简单地做到。

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import java.awt.BorderLayout;

public class JTableExample {
    public static void main(String[] args) {
        JPanel borderLayoutPanel = new JPanel(new BorderLayout());
        String[] headers = {"Header 1", "Header 2", "etc..."};
        String[][] data = {{"Some data", "some more data", "etc..."},
                {"Some data 1", "some more data 3", "etc..."},
                {"Some data 2", "some more data 4", "etc..."}};

        JTable table = new JTable(data, headers);
        JScrollPane scrollableTable = new JScrollPane(table);
        borderLayoutPanel.add(scrollableTable, BorderLayout.CENTER);

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(borderLayoutPanel);
        frame.setSize(800, 800);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

如果你真的想要一个全屏窗口,看看这个


有几种方法可以做到这一点。

我建议您阅读这个问题,因为它有助于解释为什么 null 布局不好。

TLDR 基本上是使用布局管理器。我首选的布局管理器是 MigLayout,因为它易于使用和理解,但功能丰富。如果您不能使用 MigLayout,因为它是第 3 方库,请使用类似 GridBagLayout

MigLayout 网站MigLayout 下载页面

我的首选布局管理器

如果您愿意使用第三方布局管理器,那么我认为 MigLayout 是要走的路。它提供了更多的控制,我认为比大多数布局管理器更容易使用。

private JPanel createMigPanel() {
    String layoutConstraints = "fillx, filly";
    String columnAndRowConstraints = "fill, grow, center";

    JPanel migPanel = new JPanel(new MigLayout(layoutConstraints, columnAndRowConstraints, columnAndRowConstraints));

    String[] headers = {"Header 1", "Header 2", "etc..."};
    String[][] data = {{"Some data", "some more data", "etc..."},
            {"Some data 1", "some more data 3", "etc..."},
            {"Some data 2", "some more data 4", "etc..."}};

    JTable table = new JTable(data, headers);
    JScrollPane scrollableTable = new JScrollPane(table);

    migPanel.add(new JScrollPane(table), "width 400:500:800, height 400:500:800");

    return migPanel;
}

坏路

如果您必须在 a 中使用 null 布局JPanel,这完全不推荐,那么您可以使用两个按钮将表格设置为其最小/最大大小。

// Not recommended
private JPanel createNullPanel() {
    JPanel nullPanel = new JPanel(null);

    String[] headers = {"Header 1", "Header 2", "etc..."};
    String[][] data = {{"Some data", "some more data", "etc..."},
            {"Some data 1", "some more data 3", "etc..."},
            {"Some data 2", "some more data 4", "etc..."}};

    JTable table = new JTable(data, headers);
    JScrollPane scrollableTable = new JScrollPane(table);

    scrollableTable.setMinimumSize(new Dimension(100, 100));
    scrollableTable.setMaximumSize(new Dimension(500, 500));

    JButton minButton = new JButton("Min");
    minButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            scrollableTable.setSize(scrollableTable.getMinimumSize());
        }
    });
    minButton.setBounds(10, 10, 50, 25);
    nullPanel.add(minButton);


    JButton maxButton = new JButton("Min");
    maxButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            scrollableTable.setSize(scrollableTable.getMaximumSize());
        }
    });
    maxButton.setBounds(70, 10, 50, 25);
    nullPanel.add(maxButton);

    nullPanel.add(scrollableTable);
    scrollableTable.setBounds(10, 45, 300, 300);

    return nullPanel;
}

内置布局管理器

但是,您可以使用布局管理器。GridBagLayout 有点复杂,但提供了比大多数更多的控制。

private JPanel createGridBagPanel() {
    JPanel gridBagPanel = new JPanel(new GridBagLayout());

    GridBagConstraints constraints = new GridBagConstraints();
    constraints.weightx = 1;
    constraints.weighty = 1;
    constraints.fill = GridBagConstraints.BOTH;
    constraints.insets = new Insets(10, 10, 10, 10);

    String[] headers = {"Header 1", "Header 2", "etc..."};
    String[][] data = {{"Some data", "some more data", "etc..."},
            {"Some data 1", "some more data 3", "etc..."},
            {"Some data 2", "some more data 4", "etc..."}};

    JTable table = new JTable(data, headers);
    JScrollPane scrollableTable = new JScrollPane(table);
    scrollableTable.setMinimumSize(new Dimension(400, 400));
    scrollableTable.setPreferredSize(new Dimension(500, 500));
    scrollableTable.setMaximumSize(new Dimension(800, 800));

    // Nasty work around to support min and max size
    // https://stackoverflow.com/questions/15161332/setting-up-a-maximum-component-size-when-using-gridbaglayout-in-java
    JPanel wrappingPanel = new JPanel(null);
    wrappingPanel.setLayout(new BoxLayout(wrappingPanel, BoxLayout.LINE_AXIS));
    wrappingPanel.add(scrollableTable);

    gridBagPanel.add(wrappingPanel, constraints);

    return gridBagPanel;
}

完整的代码示例

import net.miginfocom.swing.MigLayout;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class JTableExample {

    private void run() {
        setUpWindow();
    }

    private void setUpWindow() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // frame.getContentPane().add(createNullPanel());
        // frame.getContentPane().add(createGridBagPanel());
        frame.getContentPane().add(createMigPanel());

        // If using null layout manager
        // frame.setSize(800, 800);

        // If using a none null layout manager
        frame.pack();

        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    // Not recommended
    private JPanel createNullPanel() {
        JPanel nullPanel = new JPanel(null);

        String[] headers = {"Header 1", "Header 2", "etc..."};
        String[][] data = {{"Some data", "some more data", "etc..."},
                {"Some data 1", "some more data 3", "etc..."},
                {"Some data 2", "some more data 4", "etc..."}};

        JTable table = new JTable(data, headers);
        JScrollPane scrollableTable = new JScrollPane(table);

        scrollableTable.setMinimumSize(new Dimension(100, 100));
        scrollableTable.setMaximumSize(new Dimension(500, 500));

        JButton minButton = new JButton("Min");
        minButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                scrollableTable.setSize(scrollableTable.getMinimumSize());
            }
        });
        minButton.setBounds(10, 10, 50, 25);
        nullPanel.add(minButton);


        JButton maxButton = new JButton("Min");
        maxButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                scrollableTable.setSize(scrollableTable.getMaximumSize());
            }
        });
        maxButton.setBounds(70, 10, 50, 25);
        nullPanel.add(maxButton);

        nullPanel.add(scrollableTable);
        scrollableTable.setBounds(10, 45, 300, 300);

        return nullPanel;
    }

    private JPanel createGridBagPanel() {
        JPanel gridBagPanel = new JPanel(new GridBagLayout());

        GridBagConstraints constraints = new GridBagConstraints();
        constraints.weightx = 1;
        constraints.weighty = 1;
        constraints.fill = GridBagConstraints.BOTH;
        constraints.insets = new Insets(10, 10, 10, 10);

        String[] headers = {"Header 1", "Header 2", "etc..."};
        String[][] data = {{"Some data", "some more data", "etc..."},
                {"Some data 1", "some more data 3", "etc..."},
                {"Some data 2", "some more data 4", "etc..."}};

        JTable table = new JTable(data, headers);
        JScrollPane scrollableTable = new JScrollPane(table);
        scrollableTable.setMinimumSize(new Dimension(400, 400));
        scrollableTable.setPreferredSize(new Dimension(500, 500));
        scrollableTable.setMaximumSize(new Dimension(800, 800));

        // Nasty work around to support min and max size
        // https://stackoverflow.com/questions/15161332/setting-up-a-maximum-component-size-when-using-gridbaglayout-in-java
        JPanel wrappingPanel = new JPanel(null);
        wrappingPanel.setLayout(new BoxLayout(wrappingPanel, BoxLayout.LINE_AXIS));
        wrappingPanel.add(scrollableTable);

        gridBagPanel.add(wrappingPanel, constraints);

        return gridBagPanel;
    }

    private JPanel createMigPanel() {
        String layoutConstraints = "fillx, filly";
        String columnAndRowConstraints = "fill, grow, center";

        JPanel migPanel = new JPanel(new MigLayout(layoutConstraints, columnAndRowConstraints, columnAndRowConstraints));

        String[] headers = {"Header 1", "Header 2", "etc..."};
        String[][] data = {{"Some data", "some more data", "etc..."},
                {"Some data 1", "some more data 3", "etc..."},
                {"Some data 2", "some more data 4", "etc..."}};

        JTable table = new JTable(data, headers);
        JScrollPane scrollableTable = new JScrollPane(table);

        migPanel.add(new JScrollPane(table), "width 400:500:800, height 400:500:800");

        return migPanel;
    }

    public static void main(String[] args) {
        JTableExample example = new JTableExample();
        example.run();
    }
}

推荐阅读