这是使用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);
}
}
主要方法中没有任何地方是在画布上调用paint()。但是我运行程序并且它有效,那么paint()方法是如何运行的呢?
答案 0 :(得分:14)
paint
方法由事件调度线程(EDT)调用,基本上不受您控制。
它的工作方式如下:当您实现用户界面(在您的情况下调用setVisible(true)
)时,Swing启动EDT。然后,此EDT线程在后台运行,无论何时需要绘制组件,它都会调用paint
方法并使用适当的Graphics
实例进行绘制。
那么,何时需要重新绘制一个“需要”的组件? - 例如
时repaint
只要有必要,只需假设将调用。
答案 1 :(得分:5)
实际上你自己从不调用paint mathod。只要帧的内容窗格需要重新绘制,它就会自动调用。当你的框架第一次渲染,调整大小,最大化(在被最小化之后)等时会发生这种情况。
答案 2 :(得分:3)
如果您不了解AWT / Swing(渲染)绘画API的工作原理,请阅读本文 - Painting in AWT and Swing。
绘制方法无论如何触发绘制请求,都可以使用 AWT使用“回调”机制进行绘画,这种机制是 重量级和轻量级组件都是一样的。这意味着 一个程序应该将组件的渲染代码放在一个 特别重写的方法,工具包将调用此方法 什么时候画画。要覆盖的方法是 java.awt.Component中。