JPanel Preferred Size Not Being Set
When is the preferred size of a JPanel set if you don't set it explicitly?
I have the following code:
private static class ScrollableJPanel extends JPanel implements Scrollable {
开发者_Go百科 @Override
public Dimension getPreferredScrollableViewportSize() {
return getPreferredSize();
}
.
.
.
}
and this code:
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);
However, the preferred size of myPanel at the time getPreferredScrollableViewportSize() is being called seems to be an arbitrary value, (4225, 34), and prefSizeSet = false.
According to the Java documentation, this is a reasonable way to define this method. However, the actual size of myPanel is much higher than 34 pixels, so the view port is way too small.
What am I doing wrong here? Should I set the preferred size of myPanel explicitly? I tried that, but I want to use the actual size determined by the layout manager, not just make a guess that will be overridden later.
Note that my question isn't how to set an exact size for the JPanel. I want the layout manager to do that. Nor do I want to have to explicitly set the preferred size. I thought that was also handled by the layout manager. What I want to know is why the layout manager is not setting a reasonable value for the preferred size itself so that I can return a reasonable PreferredScrollableViewportSize.
In AWT (and then Swing), Container.getPreferredSize()
either:
- returns the size explicitly set by
setPreferredSize()
, - or the size calculated by the
LayoutManager
ifsetPreferredSize()
has not been called explicitly
Hence, what getPreferredSize()
returns highly depends on which LayoutManager
you use for your ScrollableJPanel
.
Be aware that most LayoutManager
s will use getPreferredSize()
on all direct children of the Container
upon which getPreferredSize()
was called. This is a recursive process (if children have children themselves) and may involve several different LayoutManager
s.
The Preferred size of a JPanel is based on the components in the panel. The Layout manager calculates a preferred size of the panel, based on the preferred size of the items in the panel, and if some of those things are panels, then it is a recursive calculation. If there are no sub components in the panel, then the preferred size will have to be set explicitly.
精彩评论