Java 根据内部元件的尺寸设置面板尺寸?

Java 根据内部元件的尺寸设置面板尺寸?,java,swing,resize,jscrollpane,Java,Swing,Resize,Jscrollpane,我有一个JScrollPane,其中包含另一个带有GridBagLayout的面板(这是一个带有JSplitPane的JTabbedPane,但我不认为这有什么区别) 我想要的很简单:如果滚动窗格的大小太小,请显示垂直滚动条,以便所有元素都可见。为了实现这一点,我为ComponentListener.ComponentResistized编写了一个简单的函数,它获取最后一个元素的位置,添加高度并减去面板本身的偏移量: int prefSize = lastButton.getLocationOn

我有一个JScrollPane,其中包含另一个带有GridBagLayout的面板(这是一个带有JSplitPane的JTabbedPane,但我不认为这有什么区别)

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

int prefSize = lastButton.getLocationOnScreen().y + lastButton.getSize().height - myGridPanel.getLocationOnScreen().y;
myGridPanel.setPreferredSize(new Dimension(400, prefSize));
遗憾的是,这只有在我手动调整窗口大小后才能起作用。在此之前,滚动条直到最后才到达,因此有几行无法访问,最顶端的JTextPane元素部分隐藏。正如我所说的,只要我调整窗口的大小(垂直或水平地增加或减小大小),每个元素都是正确的,滚动条也是完美的,一直滚动到最后一个元素之后

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

现在,除最后一行外,所有行都可以滚动,而最后一行仅可见~30%。再一次…只要我手动调整框架大小,一切看起来都像预期的那样

我觉得我错过了一些简单的东西,但我不知道会是什么。在四处搜索时,我看到了添加setPreferredSize(panel.getPreferredSize()),但这也没用

我将非常感谢在这方面的任何帮助

提前谢谢

在四处搜索时,我看到了添加setPreferredSize(panel.getPreferredSize())

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

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

我为ComponentListener编写了一个简单的函数

不需要使用组件侦听器


滚动窗格的一般用法是将其添加到边框布局的中心。然后,随着帧大小的调整,滚动窗格的大小也会改变。滚动条将根据需要出现/消失。

Hmm,听起来不错,但这对我一点帮助都没有。我尝试了
BorderLayout
BoxLayout
等,但我不知道在没有
gridbagloayout
的情况下如何让我的布局正常工作。当我遗漏任何与
setPreferredSize()
相关的内容时,这当然不起作用。@Markstar,好吧,无论你问什么问题,都应该包括一个适当的例子来说明问题。如果你听从我的建议,它会起作用的。我们猜不出你在做什么使它不起作用。是的,我知道。我只是假设/希望我忽略了一些简单的事情。正如我所说,我不能使用
BorderLayout
,因为这样文本元素就不能正确调整大小(使用换行符等),嵌套也不起作用。我看看能不能想出一个最简单的例子。
mainFrame.pack();
setPreferredSize();
mainFrame.setSize(dim);
mainFrame.revalidate();
mainFrame.repaint();