1

私の質問はこれと同じです: まだ表示されていない JPanel のサイズを取得する方法 しかし、そこに投稿された回答は私にとってはうまくいきません。BorderLayout と Preferredsize を使用して 5 つのパネルを管理しています。私の目的は、タイトルを参照してください。revalidate() validate() pack() はうまくいきませんでした。他のアイデア?

編集:

私がやろうとしているのは、小さなペイントプログラムです。シンプルなボーダーレイアウトで構成されています:

塗装構造

中央のペインは描画するペインです。しかし、getgraphics を使用して picutre に描画し、この画像を paintComponent に描画したいと考えています。そのため、画像のサイズをパネルのサイズに設定する必要があります。そして、これらすべてを準備したいのですが、setVisible を呼び出した後、パネルで描画を開始できるようにします。

編集2:

さて、私の問題は半分解決しました。setVisible の後に画像のサイズを設定できると思いましたが、サイズが正しくなるまで数秒 (通常は 2 秒) 待たなければなりませんでした。(どうしてか分かりません)。SwingUtilities.invokeLater で動作するようになりましたが、setVisible() の後でも動作します。これに到達する方法はありませんか?

4

3 に答える 3

2

setVisible() が呼び出される前に jpanel のサイズを取得する

  • JComponentSize2 つのケースで その値を返します

    1. すでに画面に表示されている

    2. JFrame.pack()が呼び出され、 の通知者がLayoutManagerpack()前に呼び出される可能性がありますsetVisible()

    3. Insets座標に使用される場合)から可能ですNullLaoyut

于 2013-11-08T23:12:05.753 に答える
2

メイン フレームに直接アクセスできる場合は、これを呼び出しJFrame#packてコンテナー階層を検証し、すべての子コンポーネントをレイアウトできます。たとえば...

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.LineBorder;

public class BeforeVisible {

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

    public BeforeVisible() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                TestPane center = new TestPane(100, 100);
                frame.add(center);
                frame.add(new TestPane(100, 50), BorderLayout.NORTH);
                frame.add(new TestPane(100, 50), BorderLayout.SOUTH);
                frame.add(new TestPane(50, 100), BorderLayout.EAST);
                frame.add(new TestPane(50, 100), BorderLayout.WEST);

                System.out.println("Size beofre pack = " + frame.getSize() + "; " + center.getSize());

                frame.pack();

                System.out.println("Size after pack = " + frame.getSize() + "; " + center.getSize());

                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private int pWidth, pHeight;

        public TestPane(int width, int height) {
            pWidth = width;
            pHeight = height;
            setBorder(new LineBorder(Color.RED));
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(pWidth, pHeight);
        }

    }

}

どの出力....

Size beofre pack = java.awt.Dimension[width=0,height=0]; java.awt.Dimension[width=0,height=0]
Size after pack = java.awt.Dimension[width=200,height=222]; java.awt.Dimension[width=100,height=100]

ここで、メイン ウィンドウに直接アクセスできない場合は、何をするにしても純粋に当て推量になります。

関心のあるコンポーネントに を追加しComponentListenerて、サイズの変化を監視することもできます...しかし、これでは「なぜ?」という疑問が生じます。

于 2013-11-08T23:19:16.917 に答える
0

一部のコンポーネント「A」(java.awt.Component、多くのスイング要素が拡張する抽象クラス、JPanel がその例) のデフォルト サイズは、コンポーネント「B」内の寸法に値が設定されていないため、B が内部的に表示された後に設定されます。 . したがって、この時点では「A」の幅と高さの値プロパティがまだ設定されていないため、コンポーネント B が表示される前のサイズを予測することはできません。

コンポーネント「A」の高さと幅を手動で取得してから、コンポーネント「A」を表示して B コンポーネントに設定できます。または、プロパティ ファイルを使用して必要なサイズを格納し、それにアクセスする Util クラスをコーディングすることもできます。

于 2013-11-08T23:04:35.380 に答える