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

时间:2011-10-14 07:49:04

标签: java graphics

这是使用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()方法是如何运行的呢?

3 个答案:

答案 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中。