【问题标题】:Setting the panel size according to the size of the inner elements?根据内部元素的大小设置面板大小?
【发布时间】:2017-11-20 18:42:12
【问题描述】:

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

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

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()); 的建议,但这也没有帮助。

我将不胜感激!

提前致谢!

【问题讨论】:

    标签: java swing resize jscrollpane


    【解决方案1】:

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

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

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

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

    不需要使用组件监听器。

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

    【讨论】:

    • 嗯,这听起来很棒,但对我根本没有帮助。我尝试过BorderLayoutBoxLayout 等,但如果没有GridBagLayout,我不知道如何让我的布局工作。当我遗漏任何setPreferredSize()-related 时,这肯定行不通。
    • @Markstar,好吧,每当您提出问题时,您都应该包含一个正确的 minimal reproducible example 来证明问题。如果你听从我的建议,它会起作用的。我们无法猜测您在做什么导致它无法正常工作。
    • 是的,我知道。我只是假设/希望我忽略了一些简单的事情。正如我所说,我不能使用BorderLayout,因为这样文本元素将无法正确调整大小(使用换行符等)并且嵌套也不起作用。我会看看我是否可以制定一个最小的例子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 2011-03-07
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    • 2019-02-16
    相关资源
    最近更新 更多