根据内部元素的大小设置面板尺寸?

时间:2017-11-20 18:42:12

标签: java swing resize jscrollpane

我有一个 JScrollPane ,其中包含另一个带有 GridBagLayout 的面板(带有 JTabbedPane ,带有 JSplitPane ,但我不认为这有所不同)。

我想要的很简单:如果 ScrollPane 的大小太小,则显示垂直滚动条,以便所有元素都可见。为了实现这一点,我为 ComponentListener.componentResized 编写了一个简单函数,该函数获取最后一个元素的位置,添加高度并减去面板本身的偏移

int prefSize = lastButton.getLocationOnScreen().y + lastButton.getSize().height - myGridPanel.getLocationOnScreen().y;
myGridPanel.setPreferredSize(new Dimension(400, prefSize));

可悲的是,这仅在之后才能正常工作我手动调整窗口大小。在此之前,滚动条直到结束才会到达,因此几行无法访问,并且最顶层的JTextPane元素被部分隐藏。正如我所说,只要我调整窗口大小(增大或减小大小,垂直或水平),每个元素都是正确的,滚动条也是完美的,滚动到最后一个元素之后。

通过在创建框架或切换到选项卡( stateChanged())时添加以下内容,我能够改善这种情况:

mainFrame.pack();
setPreferredSize();
mainFrame.setSize(dim);
mainFrame.revalidate();
mainFrame.repaint();

现在,除了最后一行之外的所有行都是可滚动的,而最后一行只能看到~30%。再一次......一旦我手动调整框架大小,一切看起来都是预期的。

感觉我错过了一些简单的东西,但我不知道它会是什么。搜索我看到了添加 setPreferredSize(panel.getPreferredSize()); 的建议,但这也没有帮助。

我很感激你的任何帮助!

提前致谢!

1 个答案:

答案 0 :(得分:1)

  

搜索我看到了添加setPreferredSize(panel.getPreferredSize())的建议; ,

错误。您永远不应该尝试管理面板的大小。这是布局管理器的工作。不要使用setPreferredSize()!

如果让布局管理器完成其工作,则布局管理器将动态计算其自己的首选大小,并且滚动条将根据需要自动显示。

  

我为ComponentListener.componentResized

编写了一个简单的函数

无需使用组件侦听器。

滚动窗格的一般用法是将其添加到框架的BorderLayout的CENTER中。然后在调整框架大小时,滚动窗格的大小会发生变化。然后滚动条将根据需要显示/消失。