2

サイズが変更されたときにイベントを送信するメインのがありますが、イベントが発生するまでに、すでにComponentListenerサイズが変更されています。JFrameJpanel

public class Test implements ComponentListener {
    private JFrame frame;
    private JPanel panel;

    public Test() {
        frame = new JFrame();
        panel = new JPanel();

        frame.setPreferredSize(new Dimension(300, 300));
        frame.getContentPane().add(panel, BorderLayout.CENTER);
        frame.addComponentListener(this);

        frame.pack();
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    Test test = new Test();
                    test.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    @Override
    public void componentResized(ComponentEvent e) {
        System.out.println(frame.getSize() + " : " + panel.getSize());
        frame.revalidate();
    }

    @Override
    public void componentHidden(ComponentEvent e) {}

    @Override
    public void componentMoved(ComponentEvent e) {}

    @Override
    public void componentShown(ComponentEvent e) {}
}

JPanel setSizeサイズ変更中にどのように制御しJFrameますか?

編集:BorderLayout境界線を埋めるためのセットコンポーネントを理解しています。コンポーネントのサイズはどのように設定されますか? それは呼んでいsetSizeますか?はいの場合、オーバーライドされた setSize が呼び出されたのはなぜですか?

4

3 に答える 3

1

setSize を呼び出していますか?

レイアウト マネージャーは、getPreferredSize()、getMinimumSize()、および getMaximum() サイズをヒントとして使用します。レイアウト マネージャーは、これらのヒントを使用または無視します。コンポーネントを BorderLayout の CENTER に追加すると、ヒントはすべて無視され、コンポーネントは使用可能なスペースに合わせてサイズ変更されます。そうです、レイアウト マネージャーはコンポーネントの setSize() (および setLocation) メソッドを呼び出します。setSize() メソッドを直接呼び出さないでください

オーバーライドされた setSize が呼び出されないのはなぜですか?

overridesetSize() メソッドを実行していません。コードを実行するとinvoked、setSize() メソッドが呼び出されます。その後、フレームがpacked()されるとレイアウトマネージャーが呼び出され、レイアウトマネージャーはパネルでsetSize()メソッドを呼び出します。

于 2013-05-24T15:20:21.133 に答える
1

コンポーネントが LayoutManager の制御下にあるコンテナーに追加された場合、コンポーネントのサイズを直接制御することはできません。これは、レイアウト マネージャーを使用する目的に反します。

コンポーネントのサイズが変更されたときに通知を受け取りたい場合は、ComponentListener を (コンテナーではなく) コンポーネントに追加します。

于 2013-05-24T15:22:03.627 に答える
0

制約が BorderLayout.CENTER の場合、BorderLayout 内のコンポーネントのサイズを変更することはできません。コンポーネントは、使用可能なすべてのスペースを自動的に使用します。

詳細情報: http://docs.oracle.com/javase/tutorial/uiswing/layout/border.html

于 2013-05-24T14:56:56.813 に答える