9

Canvas3Dには親フレームを使用して動的にサイズ変更する機能がないため、ユーザーがウィンドウのサイズを変更してから自分で手動でサイズ変更するタイミングを追跡できるようにしたいと思います。(これがCanvas3Dをクラッシュさせることになった場合、一部のドキュメントが示唆しているように、ユーザーがウィンドウのサイズを変更したときに、単に破棄して再作成します)。この手順の一部には、最初にコンテナパネルの大きさを正確に伝えることができることが含まれます。

私が試した2つの方法:

panel.getHeight();
panel.getPreferredSize()。height;

物事を正確に報告していないようです。getHeight()常にゼロでありgetPreferredSize()、実際にはパネルの実際のサイズとは関係のない数値を返します。

何か案は?

編集:それで、私はデバッガーをパネルオブジェクトに持って行き、オブジェクト以外のプロパティを手動で調べましたが、幅/高さに似たものは何も見つかりませんでした。確かに、私が見なかったサブオブジェクトがあります。また、高さ/オブジェクトを照会するときに、ウィンドウが表示されている必要がありますか(オブジェクトとインターフェイスしている時点では表示されていません)?

編集2:つまり、SwingクラスはAWTクラスのサブクラスなので、それらの高さ/幅を見つけることができれば、アプローチは一般化されると思います。それに応じてタイトルを修正しました。

4

2 に答える 2

21

コンポーネントのサイズを決定するには、次のいずれかを行う必要があります。

  • ある時点で手動で設定しました
  • コンポーネントのレイアウトを担当するレイアウトマネージャーを実行します

通常、幅と高さを含む Dimension オブジェクトを返す getSize() メソッドを介してコンポーネントの正確なサイズを取得しますが、getWidth/Height() も機能するはずです。ただし、これは、2 つの前提条件のいずれかが満たされた場合にのみ機能します。ウィンドウが一度も表示されていない場合、ウィンドウ/コンテナーが表示された後にレイアウト マネージャーまたはコンポーネント (サイズを知りたい) が追加されていない場合、サイズは通常ゼロです。

したがって、正しいサイズを取得するには、(コンポーネントを追加した後に) コンテナー/フレームを表示するか、最後のレイアウトの後にコンポーネントを追加した場合は、コンテナーで validate() または doLayout() を呼び出してレイアウトを再計算する必要があります。行われました。心に留めておくべきもう 1 つのことは、コンテナーにレイアウト マネージャーを設定し、おそらく構成することです。レイアウト マネージャーが設定されていない (null) 場合、validate() を呼び出してコンテナーを表示しても、その子のサイズは設定されません。

minimumSize/preferredSize/maximumSize プロパティは、レイアウト マネージャーへのヒントであり、コンポーネントをどのようにサイズ設定するかを示しますが、それらに従う必要はありません(ほとんどのレイアウト マネージャーは従いません)。

編集 2:同じ主題に関する他の質問を読んだ後、 Java チュートリアルのレイアウト マネージャーの使用を読む必要があると思います。

編集:あなたがすでにそれを理解しているかどうかはわかりませんが、ウィンドウのサイズ変更に反応するには、次のようにすることができます:

public class WindowResizeTest extends JFrame {

    public static void main(String[] args) {
        new WindowResizeTest();
    }

    public WindowResizeTest() {
        this.setSize(640, 480);

        JPanel panel = new JPanel();
        panel.setBackground(Color.RED);
        this.add(panel);

        this.addComponentListener(new ComponentListener() {

            public void componentResized(ComponentEvent e) {
                System.out.println(e.getComponent().getSize());
            }

            public void componentHidden(ComponentEvent e) {}

            public void componentMoved(ComponentEvent e) {}

            public void componentShown(ComponentEvent e) {}
        });

        this.setVisible(true);
    }

}
于 2008-10-17T04:41:56.820 に答える
1

JFrameで拡張すると、このコードを使用して時間、労力、スペースを節約できることがわかりました。

int windowWidth = getWidth();
int windowHeight = getHeight();

私はあなたがすでに答えを得たことを知っています、しかしあなたが代替を必要とするならば、ここにあります。

于 2012-06-28T20:49:24.257 に答える