我想知道是否有人可以解释在运行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());
}
}
答案 0 :(得分:4)
Here is a decent little write-up。
摘录:
谁调用paintComponent
...因为用户这样做而调用此方法 用户界面需要重绘的东西,或者你的 代码已明确要求重新绘制它。自动调用 当它变得可见当一个窗口变得可见时(露出或 最小化)或调整大小,“系统”自动调用 必须为屏幕的所有区域的paintComponent()方法 重绘。通过repaint()...
间接从用户定义的侦听器调用
在写作中还有更多内容以及一些参考链接,不幸的是,它们都被打破了。
我还发现this blog post从非常基本的角度讨论了Java中的绘画/绘图。看看第一段:
为什么我们将所有图形绘图代码放入paintComponent() 方法?这似乎很奇怪,因为看起来我们应该能够简单 将一些简单的图形命令粘贴到Java中的main()方法中 应用程序,只是完成绘图。 paintComponent在哪里 来自?如果我们从未在代码中调用它,它是如何执行的?
在Java文档中,您实际上必须阅读paint以了解正在发生的事情。 paintComponent documentation不是很有帮助。