Java 滚动窗格在帧较大时激活

Java 滚动窗格在帧较大时激活,java,resize,jframe,scrollbars,scrollpane,Java,Resize,Jframe,Scrollbars,Scrollpane,我正在创建一个包含菜单、工具栏、表格和按钮面板的JFrame应用程序。我想使用滚动窗格作为顶级容器,这样,如果用户调整应用程序的大小,按钮等就不会从屏幕上掉下来 以下是我的主框架构造代码: JPanel mainPanel = new JPanel(); // borderlayout, north=toolbar, center=table, south=buttton panel mainPanel.setLayout(new BorderLayout()); mainPanel.se

我正在创建一个包含菜单、工具栏、表格和按钮面板的JFrame应用程序。我想使用滚动窗格作为顶级容器,这样,如果用户调整应用程序的大小,按钮等就不会从屏幕上掉下来

以下是我的主框架构造代码:

JPanel mainPanel = new JPanel(); // borderlayout, north=toolbar, center=table, south=buttton panel   
mainPanel.setLayout(new BorderLayout());
mainPanel.setBorder(BorderFactory.createEmptyBorder());        
mainPanel.add(new MainToolBar(inventoryActions, false), BorderLayout.NORTH);
InventoryTable inventoryTable = new InventoryTable();
JScrollPane tableScrollPane = new JScrollPane(new JTable());       
mainPanel.add(new JScrollPane(tableScrollPane), BorderLayout.CENTER);        
mainPanel.add(tableScrollPane, BorderLayout.CENTER);
inventoryTable.adjustColumnWidths();
mainPanel.add(new InventoryActionsButtonPanel(inventoryActions), BorderLayout.SOUTH);

JScrollPane mainScrollPane = new JScrollPane();
mainScrollPane.setBorder(BorderFactory.createEmptyBorder());
mainScrollPane.setViewportView(mainPanel);

getContentPane().add(mainScrollPane, BorderLayout.CENTER);
如你所见。。我使用JPanel来包含工具栏、表(嵌套在另一个滚动窗格中)和按钮面板。然后我把这个面板放在主滚动窗格中。最后,我将主滚动窗格添加到内容窗格中

我的应用程序的初始大小是800x600。当我运行它时,一切看起来都很好。以下是一个屏幕截图:

但是,当我调整帧大小时,滚动面板会在帧变小之前“激活”,如您在此处所见:

你知道为什么我的滚动面板在画面还是那么大的时候显示滚动条吗?是否有我需要设置的首选尺寸

多谢各位

注意,如果我注释掉将滚动痛苦添加到主面板(中间)的代码行,或者如果我使用另一个swing组件,例如JButton,它的行为与以前不同:

//mainPanel.add(tableScrollPane, BorderLayout.CENTER);
以下是一个屏幕截图:

主要问题是
JScrollPane
使用了
JTable
,它覆盖了
getPreferredSize
属性

默认设置为
450x400

您可以使用
JTable#setPreferredScrollableViewportSize


另一个技巧是将
JTable
添加到另一个容器(如
JPanel
),并将其设置为滚动窗格的视图,而不是JTables首选的滚动大小是问题的一部分,因此我应该使用table.setPreferredSize…?非常感谢您的回答!快速提问,如果我调用setPreferredScrollableViewportSize,我应该使用什么维度?这取决于您。记住,这也会影响滚动窗格的大小,因此,如果使用pack,使用较小的大小将使框架的初始大小变小……您可以通过将
JScrollPane
添加到其他容器并覆盖它的
getPreferredSize
以成为您想要的初始大小来克服这一问题……但我不想在我的应用程序中硬编码任何大小(除了我设置为800x600的主机架初始尺寸)。然后您会遇到一些问题。即使您先将表添加到代理容器中,该容器也会使用表的首选大小来计算它自己的首选大小…如果您在窗口上使用
setSize
,那么您可以使用
0x0
好的,我想我知道了。:)谢谢。