java - 如何最大化和最小化 Swing 中 JPanel 内的 JTable?
问题描述
我正在制作一个 Swing GUI。我不知道如何最大化和最小化 JPanel 内的 JTable。
解决方案
从评论编辑
你评论说我想让表格“全屏”。如果你的意思是全屏,容器的大小,你可以简单地做到。
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 是要走的路。它提供了更多的控制,我认为比大多数布局管理器更容易使用。
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();
}
}
推荐阅读
- dask - DASK - MemoryError:无法分配形状和数据类型为 int64 的数组
- javascript - IE11:javascript“排序”中的三元引发语法错误
- git - 如何将不同的文件提交到两个不同的 SVN(或 git)存储库?
- filter - 流利位上的 grep 过滤器上的排除模式似乎不起作用
- firebase-cloud-messaging - 如何配置 apache-traffic-server 以将 http 请求转发到 https 远程服务器?
- ignite - 在 Apache Ignite 上使用 @QuerySqlField 映射同一类的不同字段
- firebase - Firestore 规则 - 数据类型验证
- java - 在 JADE 中创建代理
- python - 如何解决 ValueError:无法使用 Jupyter notebook 在 python 中为 Tensor 'Placeholder_1:0' 提供形状(230,)的值,该形状在 python 中具有形状 '(?, 4)
- regex - 如何过滤 Google 表格中的数据并包含仅匹配所有条件的结果?