如果您没有明确设置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。
答案 0 :(得分:4)
在AWT(然后是Swing)中,Container.getPreferredSize()
:
setPreferredSize()
,LayoutManager
未明确调用,则setPreferredSize()
计算的尺寸因此,getPreferredSize()
返回的内容取决于您LayoutManager
使用的ScrollableJPanel
。
请注意,大多数LayoutManager
会对getPreferredSize()
被调用Container
的所有直接子女使用getPreferredSize()
。这是一个递归过程(如果孩子自己有孩子),可能涉及几个不同的LayoutManager
。
答案 1 :(得分:3)
JPanel的首选大小基于面板中的组件。布局管理器根据面板中项目的首选大小计算面板的首选大小,如果其中一些是面板,则它是递归计算。如果面板中没有子组件,则必须明确设置首选大小。