コンポーネントの理想的なサイズが現在表示されているコンテンツ(この場合は画像)によって異なるスイング コンポーネントがあります。
コンテンツが変更されたときにこの優先サイズを変更し、レイアウトを変更できるようにしたい (たとえば、コンポーネントが JScrollPane 内で使用されている場合、スクロール範囲はコンポーネントのサイズに合わせて変更されます) .
Swing でこれを行う標準的な方法は何ですか?
コンポーネントの理想的なサイズが現在表示されているコンテンツ(この場合は画像)によって異なるスイング コンポーネントがあります。
コンテンツが変更されたときにこの優先サイズを変更し、レイアウトを変更できるようにしたい (たとえば、コンポーネントが JScrollPane 内で使用されている場合、スクロール範囲はコンポーネントのサイズに合わせて変更されます) .
Swing でこれを行う標準的な方法は何ですか?
提案:
getPreferredSize()
パラメータを持つ Dimension を返すメソッド オーバーライドを指定します。getPreferredSize の例:
public Dimension getPreferredSize() {
if (myBuffImg != null) {
return new Dimension(myBuffImg.getWidth(), myBuffImg.getHeight());
}
// default return value
return super.getPreferredSize();
}
編集
コメントについて:
コンポーネントのコンテンツ画像が変更された場合、どのように処理しますか? 周囲のコンテナで再レイアウトをトリガーするだけの場合ですか?
もちろん、このクラスにメソッドを与え、このメソッド内からこのパネルsetImage(Image image)
を作成できます。repaint()
メソッドがこの JPanel の祖先を呼び出しrevalidate()
て、このコンポーネントが再レイアウトされる可能性があると思いますが、このクラスのメソッドがその祖先に副作用を持っていることにあまり夢中ではなく、コードの呼び出しに適している可能性が高いと思いますsetImage(...)
コンテナーがそれ自体を再検証することを提案するメソッド。
多くはあなたの個々のニーズに帰着します。「画像ペイン」を扱う場合、通常、画像が変更されたときにsetPreferredSize
andinvalidate
を呼び出しrepaint
ます。
いずれにせよ、レイアウトを変更すると、無効化された再印刷要求が自動的にトリガーされます。
しかし、ホバークラフトには同意します。これは、独自の税関パネルから行う必要があります。
CardLayout
別のアプローチは、単一のパネルをクリーンアップしてそれにコンポートを再度追加するのではなく、異なるコンテンツレイアウトアウト間の変更を処理するようなものを使用することです
Scrollableも見てみましょう