【问题标题】:Scroll Pane Activating When Frame Is Large当框架很大时激活滚动窗格
【发布时间】:2014-04-01 22:16:51
【问题描述】:

我正在创建一个包含菜单、工具栏、表格和按钮面板的 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。当我运行它时,一切看起来都很好。截图如下:

但是,当我调整框架大小时,滚动面板会在框架变小之前“激活”,如您在此处看到的:

知道为什么我的滚动面板在框架仍然那么大的情况下显示滚动条吗?我必须设置一些首选尺寸吗?

谢谢。

请注意,如果我注释掉将滚动疼痛添加到主面板(中心)的代码行,或者如果我使用另一个摆动组件,例如 JButton,它的行为就不会像以前那样:

//mainPanel.add(tableScrollPane, BorderLayout.CENTER);

这是截图:

【问题讨论】:

  • JTables 首选的可滚动大小是问题的一部分
  • 所以我应该使用 table.setPreferredSize...?

标签: java resize jframe scrollbars scrollpane


【解决方案1】:

(主要)问题是JScrollPane 使用的是JTablegetPreferredScrollableViewportSize,它覆盖了getPreferredSize 属性。

默认设置为450x400

您可以使用 JTable#setPreferredScrollableViewportSize 更改此设置

另一个技巧是将JTable 添加到另一个容器(如JPanel)并将其设置为滚动窗格的视图

【讨论】:

  • 非常感谢您的回答!快速提问,如果我调用 setPreferredScrollableViewportSize 我应该使用什么维度?
  • 这取决于你。请记住,这也会影响滚动窗格的大小,因此如果使用 pack,使用小尺寸会使框架的初始尺寸变小...您可以通过将 JScrollPane 添加到其他容器并覆盖来克服这个问题getPreferredSize 是您想要的初始大小...
  • 但我不想在我的应用程序中硬编码任何尺寸(我设置为 800x600 的主框架初始尺寸除外)。
  • 那么你会遇到一些问题。即使您首先将表添加到代理容器,该容器将使用表的首选大小来计算它自己的首选大小...如果您在窗口上使用setSize,那么您可以使用0x0
  • 好的,我想我明白了。 :) 谢谢。
猜你喜欢
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-25
相关资源
最近更新 更多