当框架小于 table 时,GridBagLayout 导致 JScrollPane 消失

GridBagLayout causing JScrollPane to disappear when the frame is smaller than the table

我有一个 JTable,已放入 JScrollPane 中。 然后我将该 JScrollPane 添加到 JFrame,以便 JScrollpane 将显示在 JFrame 上。这行得通。

我面临的问题是,当我手动调整 JFrame 的大小使其小于 JScrollPane 时,整个 JScrollPane 就消失成一个小图标。我正在为我的 JFrame 使用 GridBagLayout,并出于某种原因缩小了范围,我认为是 GridBag 造成的。我可以删除 GridBagLayout,它会按我的预期工作。

我已经设法获得了我正在寻找的功能,但前提是我没有将 JFrame 设置为使用 GridBagLayout。

import java.awt.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;


public class GridBagIssueExample
{
 public static void main(String[] args)
{
JTable NewTable = new JTable(); //create a JTable. Set up the Data model and add some data to it.
DefaultTableModel dtm = new DefaultTableModel();
NewTable.setModel(dtm);
NewTable.setRowHeight(100);
String[] Headers = new String[] {"Test0", "Test1", "LongTest", "SuperLongTest", "ST"};

dtm.setColumnIdentifiers(Headers);
dtm.addRow (new String[] {"0", "1", "123123123123", "2312321", "1"});
dtm.addRow (new String[] {"1", "1", "123123123123", "2312321", "1"});
dtm.addRow (new String[] {"2", "1", "123123123123", "2312321", "1"});
dtm.addRow (new String[] {"3", "1", "123123123123", "2312321", "1"});
dtm.addRow (new String[] {"4", "1", "123123123123", "2312321", "1"});
dtm.addRow (new String[] {"5", "1", "123123123123", "2312321", "1"});
NewTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
//AUTO_RESIZE_OFF is important to get the functionality I want.

//Create a JScrollPane using the table.
  JScrollPane TablePane = new JScrollPane(NewTable); 

  //Create a JFrame and add the ScrollPane to it. 
  JFrame frame = new JFrame("JScrollPane Test");
  frame.getContentPane().add(TablePane);

  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.pack();
  frame.setLocationRelativeTo(null);

  frame.setLayout(new GridBagLayout()); //Remove this line here and it works exactly how I want it to.
  frame.setVisible(true);
}
}

上面的代码演示了这个问题。它将创建一个 JTable,将其添加到 JSrollPane,然后将其添加到 JFrame。 运行 执行此操作并将 JFrame 的大小调整为小于 JScrollPane 以查看我的问题。

最后一行将 JFrame 设置为使用 GridBagLayout。

如果您注释掉或删除这一行,整个过程将完全按照我想要的方式运行。我需要将 GridBagLayout 用于我正在处理的内容,因此根本不使用它不是一个选项。

非常感谢对此提供帮助,因为即使经过大量谷歌搜索我也无法弄清楚为什么会这样。

没有定义 GridBagConstraints

  //Create a JFrame and add the ScrollPane to it. 
  JFrame frame = new JFrame("JScrollPane Test");
  frame.getContentPane().setLayout(new GridBagLayout()); //Remove this line here and it works exactly how I want it to.
  GridBagConstraints c = new GridBagConstraints();
  c.fill = GridBagConstraints.BOTH;
  c.weightx = 1.0;
  c.weighty = 1.0;
  frame.getContentPane().add( tablePane, c );