未设置JPanel首选大小

时间:2011-04-28 21:23:21

标签: java swing jpanel scrollable

如果您没有明确设置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 documentation,这是定义此方法的合理方法。但是,myPanel的实际大小远远高于34像素,因此视口太小了。

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

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

2 个答案:

答案 0 :(得分:4)

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

  • 返回setPreferredSize()
  • 明确设置的大小 如果LayoutManager未明确调用,则
  • setPreferredSize()计算的尺寸

因此,getPreferredSize()返回的内容取决于您LayoutManager使用的ScrollableJPanel

请注意,大多数LayoutManager会对getPreferredSize()被调用Container的所有直接子女使用getPreferredSize()。这是一个递归过程(如果孩子自己有孩子),可能涉及几个不同的LayoutManager

答案 1 :(得分:3)

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