为什么paintComponent()运行,即使没有人调用它?

时间:2013-10-04 03:50:57

标签: java swing user-interface

我想知道是否有人可以解释在运行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());  
    }
}

1 个答案:

答案 0 :(得分:4)

关于如何处理paintComponent的

Here is a decent little write-up

摘录:

  

谁调用paintComponent

     

...因为用户这样做而调用此方法   用户界面需要重绘的东西,或者你的   代码已明确要求重新绘制它。自动调用   当它变得可见当一个窗口变得可见时(露出或   最小化)或调整大小,“系统”自动调用   必须为屏幕的所有区域的paintComponent()方法   重绘。通过repaint()...

间接从用户定义的侦听器调用

在写作中还有更多内容以及一些参考链接,不幸的是,它们都被打破了。

我还发现this blog post从非常基本的角度讨论了Java中的绘画/绘图。看看第一段:

  

为什么我们将所有图形绘图代码放入paintComponent()   方法?这似乎很奇怪,因为看起来我们应该能够简单   将一些简单的图形命令粘贴到Java中的main()方法中   应用程序,只是完成绘图。 paintComponent在哪里   来自?如果我们从未在代码中调用它,它是如何执行的?

在Java文档中,您实际上必须阅读paint以了解正在发生的事情。 paintComponent documentation不是很有帮助。