JPanelは、設定されていないサイズを好みます
-
26-10-2019 - |
質問
明示的に設定しない場合、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の正確なサイズをどのように設定するかではないことに注意してください。レイアウトマネージャーにそれをしてもらいたいです。また、優先サイズを明示的に設定する必要はありません。レイアウトマネージャーによっても処理されたと思いました。私が知りたいのは、レイアウトマネージャーが優先サイズ自体の合理的な値を設定していない理由で、合理的な優先順位を返すことができるようにすることです。
解決
JPanelの優先サイズは、パネルのコンポーネントに基づいています。レイアウトマネージャーは、パネル内のアイテムの優先サイズに基づいて、パネルの優先サイズを計算し、それらの一部がパネルである場合、再帰計算です。パネルにサブコンポーネントがない場合、優先サイズを明示的に設定する必要があります。
他のヒント
awtで(そしてスイング)、 Container.getPreferredSize()
また:
- 明示的に設定されたサイズを返します
setPreferredSize()
, - または、によって計算されたサイズ
LayoutManager
もしもsetPreferredSize()
明示的に呼ばれていません
したがって、何 getPreferredSize()
返品はどちらに大きく依存します LayoutManager
あなたはあなたのために使用します ScrollableJPanel
.
ほとんどのことに注意してください LayoutManager
Sは使用します getPreferredSize()
のすべての直接の子供について Container
その上に getPreferredSize()
と呼ばれていました。これは再帰的なプロセスです(子供が自分で子供がいる場合)、いくつかの異なることを伴う場合があります LayoutManager
s。