Java JTable和gridbag布局的问题

Java JTable和gridbag布局的问题,java,swing,jtable,layout-manager,gridbaglayout,Java,Swing,Jtable,Layout Manager,Gridbaglayout,我正在尝试设置一个面板,可以容纳两个不同的桌子,一个是窗口宽度的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 I

我正在尝试设置一个面板,可以容纳两个不同的桌子,一个是窗口宽度的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

我尝试过的一些事情:

  • 将gridwidth分别设置为1和2
  • 将填充设置为垂直
  • 更改权重x
  • 每次更换后,我仍然会在窗口内看到两张大小相同的桌子

    我没有尝试过的事情:
    1.新的布局-我已经和Swing一起工作了大约一周,所以有可能有一个不同于GridBagLayout的布局来解决这个问题,但是我相对缺乏经验,这让我很难知道

    在使用JTable时,JScrollPane似乎忽略了我的设置,但我不确定这是否属实,如果属实,为什么属实。在此问题上的任何协助都将不胜感激

    以下是我希望布局的图片:

    更新

    经过进一步测试,这似乎是一个窗口的宽度问题。如果将窗口的宽度向下拖动到~950以下,您会注意到布局“捕捉”到正确的比例。也许这暗示了罪犯的身份。我不确定GridBagLayout在不同的窗口宽度下是否有不同的作用,但我假设它在所有尺寸下都以相同的方式缩放,这是我使用它的主要原因。

    使用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);
        }
    };
    
    另一个选择是使用。它旨在始终以相对尺寸显示组件:

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

    使用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);
        }
    };
    
    另一个选择是使用。它旨在始终以相对尺寸显示组件:

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

    1) 为了更快地获得更好的帮助,请发布一个or。(包括代码导入,并确保它将按原样为其他人编译和运行。)2)以最小尺寸提供GUI预期布局的ASCII艺术或简单绘图,如果可以调整大小,则具有更大的宽度和高度。
    frame.add(tablePanel);frame.setVisible(true)
    在添加最后一个组件之后和设置框架可见之前,应该始终有一个
    frame.pack()
    。怀疑这正是问题所在,但请确保这样做是为了消除所有怀疑。@AndrewThompson谢谢,我用导入更新了代码并添加了frame.pack()。我没有用背包,因为它弄乱了我的窗户尺寸。另外,正如您所料,pack()没有更改两个表的大小。1)要更快地获得更好的帮助,请发布或。(包括代码导入,并确保它将按原样为其他人编译和运行。)2)以最小尺寸提供GUI预期布局的ASCII艺术或简单绘图,如果可以调整大小,则具有更大的宽度和高度。
    frame.add(tablePanel);frame.setVisible(true)
    在添加最后一个组件之后和设置框架可见之前,应该始终有一个
    frame.pack()
    。怀疑这正是问题所在,但请确保这样做是为了消除所有怀疑。@AndrewThompson谢谢,我用导入更新了代码并添加了frame.pack()。我没有用背包,因为它弄乱了我的窗户尺寸。另外,正如您所预料的,pack()没有改变两个表的大小。设置初始比率解决了这个问题。谢谢你的帮助。我将检查相对布局,因为它似乎是一个更好的解决方案。设置初始比率解决了问题。谢谢你的帮助。我将检查相对布局,因为它似乎是一个更好的解决方案。