1

如果您没有明确设置 JPanel 的首选大小,那么它何时设置?

我有以下代码:

private static class ScrollableJPanel extends JPanel implements Scrollable {
    @Override
    public Dimension getPreferredScrollableViewportSize() {
                 return getPreferredSize();
    }
            .
            .
            .
}

这个代码:

    myPanel = new ScrollableJPanel();
            // Add a bunch of controls to the panel.
    final JScrollPane scroll = new JScrollPane(myPanel);
    scroll.setAutoscrolls(true);
    scroll.setHorizontalScrollBarPolicy(
        ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

但是,在调用 getPreferredScrollableViewportSize() 时 myPanel 的首选大小似乎是任意值 (4225, 34),并且 prefSizeSet = false。

根据Java 文档,这是定义此方法的合理方式。然而,myPanel 的实际尺寸远高于 34 像素,因此视口太小了。

我在这里做错了什么?我应该明确设置 myPanel 的首选大小吗?我试过了,但我想使用布局管理器确定的实际大小,而不仅仅是做出稍后会被覆盖的猜测。

请注意,我的问题不是如何为 JPanel 设置确切的大小。我希望布局管理器这样做。我也不想显式设置首选大小。我认为这也由布局管理器处理。我想知道的是为什么布局管理器没有为首选大小本身设置一个合理的值,以便我可以返回一个合理的 PreferredScrollableViewportSize。

4

2 回答 2

4

在 AWT(然后是 Swing)中,Container.getPreferredSize()可以:

  • 返回显式设置的大小setPreferredSize()
  • LayoutManager或者if计算的大小setPreferredSize()没有被显式调用

因此,getPreferredSize()返回的高度取决于LayoutManager您使用的ScrollableJPanel.

请注意,大多数LayoutManagers 将用于被调用getPreferredSize()的所有直接子级。这是一个递归过程(如果孩子自己有孩子),可能涉及几个不同的 s。ContainergetPreferredSize()LayoutManager

于 2011-04-28T22:01:30.343 回答
3

JPanel 的首选大小取决于面板中的组件。布局管理器根据面板中项目的首选大小计算面板的首选大小,如果其中一些是面板,则它是递归计算。如果面板中没有子组件,则必须明确设置首选大小。

于 2011-04-29T03:36:07.337 回答