7

これは、楕円を描く簡単な例です。

public class SwingPainter extends JFrame{
    public SwingPainter() {
        super("Swing Painter");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        getContentPane().add(new MySwingComponent());

        setSize(200, 200);
        setVisible(true);
    }

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

    class MySwingComponent extends JComponent {

         public void paintComponent(Graphics g) {
            System.out.println("paintComponent");
            super.paintComponent(g);
            g.setColor(Color.red);
            g.fillOval(10, 10, 50, 50);
        }

        @Override
        protected void paintBorder(Graphics g) {
            System.out.println("Paint border");
            super.paintBorder(g);
        }

        @Override
        protected void paintChildren(Graphics g) {
            System.out.println("Paint children");
            super.paintChildren(g);
        }
    }
}

しかし、(例のように) 描画する前にデバッグ モードまたはコンソールに情報を追加すると、swing がコンポーネントを 2 回描画することがわかります。

paintComponent

境界線をペイント

子供たちを描く

paintComponent

境界線をペイント

子供たちを描く

なぜそうなるのかはわかりませんが、難しい GUI でのパフォーマンスに影響を与える可能性があると思います。

4

3 に答える 3

9

記事「AWTとSwingでのペイント:追加のペイントプロパティ:不透明度」は、その理由を示唆しています。「不透明なプロパティにより、Swingのペイントシステムは、特定のコンポーネントの再ペイント要求で、基になる祖先の追加の再ペイントが必要かどうかを検出できます。」を拡張するためJComponentopaqueプロパティはデフォルトでfalseであり、最適化はできません。プロパティを設定してtrue、違いと、プロパティを尊重しないことによるアーティファクトを確認します。関連する例はここここにあります。

于 2012-08-15T10:19:40.843 に答える
2

これは私にはうまくいきます。実際、デバッグモードでも出力は次のようになりました。

paintComponent
Paint border
Paint children

AWT および Swing コンポーネントには、GUI エンジンが適切であると判断した場合にコールバックを介して呼び出される多くのメソッド (paint、paintBorder、paintChildren、paintComponent、repaint など) があることに注意してください。これは、JVM ごとに、または別の実行セッションによっても異なる場合があります。また、プログラムへのインタラクションからトリガーすることもできます (たとえば、最小化/最大化する場合)。または、まったくそうでない場合もあります。

于 2012-08-15T10:15:30.970 に答える
2

覚えておく必要があることは、Konstantin に同意します。再描画マネージャーは、アプリケーションの起動時に任意の数の要求に応答します。これには、通常、ウィンドウが表示されてサイズ変更されたときの最初の描画要求が含まれます (2 つある)。

これを試して。アプリケーションが実行されるまで待ってから、ウィンドウのサイズを変更します。再描画のリクエストが数件以上来ると思います ;)

于 2012-08-15T10:13:35.407 に答える