JTable 和 GridBagLayout 的问题
Problems with JTable and GridBagLayout
我正在尝试设置一个面板来容纳两个不同的表格,一个是 window 宽度的 1/3,另一个是 [=45] 宽度的 2/3 =].这是我一直在测试的演示代码:
import java.awt.*;
import javax.swing.*;
public class TableTest {
public static void main(String[] args)
{
JFrame frame = new JFrame("Test Frame");
frame.setTitle("Logged In");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(1000, 800);
frame.setLocationRelativeTo(null);
JPanel tablePanel = new JPanel(new GridBagLayout());
GridBagConstraints setup = new GridBagConstraints();
JTable table1 = new JTable();
table1.setFillsViewportHeight(true);
setup.fill = GridBagConstraints.BOTH;
setup.weightx = 0.5;
setup.weighty = 1;
setup.gridx = 0;
setup.insets = new Insets(10,10,10,5);
tablePanel.add(new JScrollPane(table1), setup);
JTable table2 = new JTable();
table2.setFillsViewportHeight(true);
setup.fill = GridBagConstraints.BOTH;
setup.weightx = 1;
setup.weighty = 1;
setup.gridx = 1;
setup.insets = new Insets(10,5,10,10);
tablePanel.add(new JScrollPane(table2), setup);
frame.add(tablePanel);
frame.pack();
frame.setVisible(true);
}
}
如果我使用 JTextArea 而不是 JTable,我会得到正确的布局,两个区域,一个是 window 宽度的 1/3,另一个是宽度的 2/3。当我使用 JTable 时,我得到两个区域,每个区域的宽度为 window.
的 1/2
我尝试过的一些事情:
- 分别将网格宽度设置为 1 和 2
- 将填充设置为垂直
- 改变权重x
每次更改后,我仍然在 window 中得到两个大小相同的表。
我没试过的东西:
1. 新布局 - 我已经使用 Swing 大约一周了,所以可能有 GridBagLayout 以外的布局可以解决这个问题,但我相对缺乏经验,所以很难知道。
似乎 JScrollPane 在使用 JTable 时忽略了我的设置,但我不确定这是否属实,如果属实,为什么如此。在此问题上的任何帮助将不胜感激。
这是我希望布局的图片:
Layout Example
更新
经过进一步测试,这似乎是 window 的宽度问题。如果将 window 的宽度向下拖动到 ~950 以下,您会注意到布局 "snap" 的比例正确。也许这可能暗示了罪魁祸首。我不确定 GridBagLayout 是否在不同的 window 宽度下表现不同,但我假设它在所有尺寸下都以相同的方式缩放,这是我使用它的主要原因。
使用 GridBagLayout 时,组件会在框架打包时以其首选大小显示。
weightx
参数仅在调整框架大小时适用。如果宽度增加,则根据相对 weightx
值分配额外的空间。
因此,如果您始终希望表格的比例为 1/3、2/3,那么您需要按照该初始比例设置表格的大小。例如:
JTable table1 = new JTable()
{
@Override
public Dimension getPreferredScrollableViewportSize()
{
return new Dimension(100, 100);
}
};
...
JTable table2 = new JTable()
{
@Override
public Dimension getPreferredScrollableViewportSize()
{
return new Dimension(200, 100);
}
};
另一种选择是使用Relative Layout。它旨在始终以相对大小显示组件:
RelativeLayout rl = new RelativeLayout(RelativeLayout.X_AXIS);
rl.setGap(10);
JPanel panel = new JPanel( rl );
panel.add(new JScrollPane(table1), new Float(1));
panel.add(new JScrollPane(table2), new Float(2));
我正在尝试设置一个面板来容纳两个不同的表格,一个是 window 宽度的 1/3,另一个是 [=45] 宽度的 2/3 =].这是我一直在测试的演示代码:
import java.awt.*;
import javax.swing.*;
public class TableTest {
public static void main(String[] args)
{
JFrame frame = new JFrame("Test Frame");
frame.setTitle("Logged In");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(1000, 800);
frame.setLocationRelativeTo(null);
JPanel tablePanel = new JPanel(new GridBagLayout());
GridBagConstraints setup = new GridBagConstraints();
JTable table1 = new JTable();
table1.setFillsViewportHeight(true);
setup.fill = GridBagConstraints.BOTH;
setup.weightx = 0.5;
setup.weighty = 1;
setup.gridx = 0;
setup.insets = new Insets(10,10,10,5);
tablePanel.add(new JScrollPane(table1), setup);
JTable table2 = new JTable();
table2.setFillsViewportHeight(true);
setup.fill = GridBagConstraints.BOTH;
setup.weightx = 1;
setup.weighty = 1;
setup.gridx = 1;
setup.insets = new Insets(10,5,10,10);
tablePanel.add(new JScrollPane(table2), setup);
frame.add(tablePanel);
frame.pack();
frame.setVisible(true);
}
}
如果我使用 JTextArea 而不是 JTable,我会得到正确的布局,两个区域,一个是 window 宽度的 1/3,另一个是宽度的 2/3。当我使用 JTable 时,我得到两个区域,每个区域的宽度为 window.
的 1/2我尝试过的一些事情:
- 分别将网格宽度设置为 1 和 2
- 将填充设置为垂直
- 改变权重x
每次更改后,我仍然在 window 中得到两个大小相同的表。
我没试过的东西:
1. 新布局 - 我已经使用 Swing 大约一周了,所以可能有 GridBagLayout 以外的布局可以解决这个问题,但我相对缺乏经验,所以很难知道。
似乎 JScrollPane 在使用 JTable 时忽略了我的设置,但我不确定这是否属实,如果属实,为什么如此。在此问题上的任何帮助将不胜感激。
这是我希望布局的图片: Layout Example
更新
经过进一步测试,这似乎是 window 的宽度问题。如果将 window 的宽度向下拖动到 ~950 以下,您会注意到布局 "snap" 的比例正确。也许这可能暗示了罪魁祸首。我不确定 GridBagLayout 是否在不同的 window 宽度下表现不同,但我假设它在所有尺寸下都以相同的方式缩放,这是我使用它的主要原因。
使用 GridBagLayout 时,组件会在框架打包时以其首选大小显示。
weightx
参数仅在调整框架大小时适用。如果宽度增加,则根据相对 weightx
值分配额外的空间。
因此,如果您始终希望表格的比例为 1/3、2/3,那么您需要按照该初始比例设置表格的大小。例如:
JTable table1 = new JTable()
{
@Override
public Dimension getPreferredScrollableViewportSize()
{
return new Dimension(100, 100);
}
};
...
JTable table2 = new JTable()
{
@Override
public Dimension getPreferredScrollableViewportSize()
{
return new Dimension(200, 100);
}
};
另一种选择是使用Relative Layout。它旨在始终以相对大小显示组件:
RelativeLayout rl = new RelativeLayout(RelativeLayout.X_AXIS);
rl.setGap(10);
JPanel panel = new JPanel( rl );
panel.add(new JScrollPane(table1), new Float(1));
panel.add(new JScrollPane(table2), new Float(2));