1

main() のすべてのステートメントが実行された直後に、paintComponent() が呼び出される方法/理由を誰かが説明できるかどうか疑問に思っていました。私が混乱している理由は、painComponent() への明示的な呼び出しがないにもかかわらず実行されるためです。

// JComponent is a base class for custom components 
public class SimpleDraw extends JPanel {
    public static void main(String[] args) {
        SimpleDraw canvas = new SimpleDraw();
        JFrame f = new JFrame("SimpleDraw"); // jframe is the app window
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(400, 400); // window size
        f.setContentPane(canvas); // add canvas to jframe
        f.setVisible(true); // show the window
    }
    // custom graphics drawing 
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g; // cast to get 2D drawing methods
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,  // antialiasing look nicer
                            RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setStroke(new BasicStroke(32)); // 32 pixel thick stroke
        g2.setColor(Color.BLUE); // make it blue
        g2.drawLine(0, 0, getWidth(), getHeight());  // draw line 
        g2.setColor(Color.RED);
        g2.drawLine(getWidth(), 0, 0, getHeight());  
    }
}
4

1 に答える 1

4

これは、 paintComponent がどのように処理されるかについてのまともな小さな記事です。

抜粋:

paintComponent の呼び出し元

... このメソッドが呼び出されるのは、ユーザーがユーザー インターフェイスで再描画が必要な操作を行ったか、コードが再描画を明示的に要求したためです。表示されると自動的に呼び出される ウィンドウが表示される (覆われていない、最小化されていない) か、サイズが変更されると、「システム」は再描画が必要な画面のすべての領域に対して paintComponent() メソッドを自動的に呼び出します。repaint() を介してユーザー定義のリスナーから間接的に呼び出されます ...

残念ながら、いくつかの参照リンクと同様に、記事にはさらに多くのものがありますが、残念ながらすべて壊れています.

また、非常に基本的な観点から Java でのペイント/描画について説明しているこのブログ投稿も見つけました。最初の段落をチェックしてください。

すべてのグラフィック描画コードを paintComponent() メソッドに入れるのはなぜですか? 単純なグラフィック コマンドを Java アプリケーションの main() メソッドに追加するだけで、描画を完了することができるように思われるため、奇妙に思えます。paintComponent はどこから来たのですか? コードでそれを呼び出さない場合、どのように実行されるのでしょうか?

Java ドキュメントでは、何が起こっているのかを理解するために実際にペイントを読む必要があります。paintComponentのドキュメントはあまり役に立ちません。

于 2013-10-04T03:58:45.803 に答える