2

コンポーネントの理想的なサイズが現在表示されているコンテンツ(この場合は画像)によって異なるスイング コンポーネントがあります。

コンテンツが変更されたときにこの優先サイズを変更し、レイアウトを変更できるようにしたい (たとえば、コンポーネントが JScrollPane 内で使用されている場合、スクロール範囲はコンポーネントのサイズに合わせて変更されます) .

Swing でこれを行う標準的な方法は何ですか?

4

2 に答える 2

4

提案:

  • JPanel (または JComponent) を拡張したクラスを使用し、
  • 必要なgetPreferredSize()パラメータを持つ Dimension を返すメソッド オーバーライドを指定します。
  • たとえば、直径が BufferedImage に基づく場合、次のようになります。

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(...)コンテナーがそれ自体を再検証することを提案するメソッド。

于 2012-09-23T03:53:32.540 に答える
3

多くはあなたの個々のニーズに帰着します。「画像ペイン」を扱う場合、通常、画像が変更されたときにsetPreferredSizeandinvalidateを呼び出しrepaintます。

いずれにせよ、レイアウトを変更すると、無効化された再印刷要求が自動的にトリガーされます。

しかし、ホバークラフトには同意します。これは、独自の税関パネルから行う必要があります。

CardLayout別のアプローチは、単一のパネルをクリーンアップしてそれにコンポートを再度追加するのではなく、異なるコンテンツレイアウトアウト間の変更を処理するようなものを使用することです

Scrollableも見てみましょう

于 2012-09-23T03:59:04.307 に答える