如何在没有在main方法中调用的情况下运行paint()?

这是使用awt包的java图形的初学者问题。 我在网上发现了这个代码来绘制一些简单的图形。

import java.awt.*; public class SimpleGraphics extends Canvas{ /** * @param args */ public static void main(String[] args) { SimpleGraphics c = new SimpleGraphics(); c.setBackground(Color.white); c.setSize(250, 250); Frame f = new Frame(); f.add(c); f.setLayout(new FlowLayout()); f.setSize(350,350); f.setVisible(true); } public void paint(Graphics g){ g.setColor(Color.blue); g.drawLine(30, 30, 80, 80); g.drawRect(20, 150, 100, 100); g.fillRect(20, 150, 100, 100); g.fillOval(150, 20, 100, 100); } } 

主要方法中没有任何地方是在canvas上调用paint()。 但是我运行程序并且它可以工作,那么paint()方法是如何运行的呢?

paint方法由Event Dispatch Thread(EDT)调用,基本上不受你的控制。

它的工作原理如下:当您实现用户界面(在您的情况下调用setVisible(true) )时,Swing启动EDT。 然后,此EDT线程在后台运行,无论何时需要绘制组件,它都会使用适当的Graphics实例调用paint方法以供绘制。

那么,何时需要重新绘制一个“需要”的组件? – 比如说什么时候

  • 窗口resize
  • 组件可见
  • 当你打电话给repaint

简单地假设只要有必要就会调用它。

实际上你自己从不调用paint mathod。 只要帧的内容窗格需要重新绘制,它就会自动调用。 当你的帧第一次渲染,resize,最大化(在被最小化之后)等时会发生这种情况。

如果你不知道AWT / Swing(渲染)绘画API如何工作,那么请阅读这篇文章 – 在AWT和Swing中绘画 。

绘制方法无论触发绘制请求的方式如何,AWT都使用“回调”机制进行绘制,这种机制对于重量级和轻量级组件都是相同的。 这意味着程序应该将组件的呈现代码放在特定的重写方法中,并且工具包将在绘制时调用此方法。 要重写的方法是在java.awt.Component中。