我有一个 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()); 的建议,但这也没有帮助。
我很感激你的任何帮助!
提前致谢!
答案 0 :(得分:1)
搜索我看到了添加setPreferredSize(panel.getPreferredSize())的建议; ,
错误。您永远不应该尝试管理面板的大小。这是布局管理器的工作。不要使用setPreferredSize()!
如果让布局管理器完成其工作,则布局管理器将动态计算其自己的首选大小,并且滚动条将根据需要自动显示。
我为ComponentListener.componentResized
编写了一个简单的函数
无需使用组件侦听器。
滚动窗格的一般用法是将其添加到框架的BorderLayout的CENTER中。然后在调整框架大小时,滚动窗格的大小会发生变化。然后滚动条将根据需要显示/消失。