JTable和GridBagLayout的问题

时间:2015-11-21 18:47:50

标签: java swing jtable layout-manager gridbaglayout

我正在尝试设置一个Panel,它将包含两个不同的表,一个是窗口宽度的1/3,另一个是窗口宽度的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,我会得到正确的布局,两个区域,其中一个是窗口宽度的1/3,另一个是宽度的2/3。当我使用JTable时,我得到两个区域,每个区域都是窗口宽度的1/2。

我尝试过的一些事情:

  1. 分别将gridwidth设置为1和2
  2. 将填充设置为VERTICAL
  3. 改变体重x
  4. 每次更改后,我仍会在窗口内获得两个大小相同的表格。

    我没有尝试过的事情:
    1.新版本 - 我已经和Swing一起工作了大约一个星期,所以可能有一个除了GridBagLayout之外的布局解决了这个问题,但我相对缺乏经验使得很难知道。

    似乎JScrollPane在使用JTable时忽略了我的设置,但我不确定这是否属实,如果是,为什么它是真的。对此事的任何帮助将不胜感激。

    这是我希望布局看起来像的图片: Layout Example

    更新
    经过进一步测试,它似乎是窗口宽度的问题。如果你将窗口的宽度向下拖动到〜950以下,你会注意到布局" snap"达到正确的比例。也许这可能暗示了罪魁祸首。我不确定GridBagLayout在不同的窗口宽度下是否有不同的作用,但我认为它在所有尺寸下都以相同的方式缩放,这是我使用它的主要原因。

1 个答案:

答案 0 :(得分:4)

使用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));