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() 方法中,然后完成绘图。油漆组件从何而来?如果我们从不在代码中调用它,它是如何执行的?

在 Java 文档中,您实际上必须阅读绘画才能开始了解发生了什么。paintComponent 文档不是很有帮助。

于 2013-10-04T03:58:45.803 回答