什么时候油漆在这个程序中调用?另外,为什么它会扩展画布?

时间:2013-04-11 03:03:29

标签: java swing awt

import java.awt.*;
import javax.swing.JFrame;

public class GraphicsDemo1 extends Canvas
{
    public void paint( Graphics g )
    {
        g.setColor(Color.green);
        g.drawRect(50,20,100,200);  // draw a rectangle
        g.fillOval(160,20,100,200); // draw a filled-in oval
        g.setColor(Color.blue);
        g.fillRect(200,400,200,20); // a filled-in rectangle
        g.drawOval(200,430,200,100);

        g.setColor(Color.black);
        g.drawString("Graphics are pretty neat.", 500, 100);
        int x = getWidth() / 2;
        int y = getHeight() / 2;
        g.drawString("The first letter of this string is at (" + x + "," + y + ")", x, y);
    }

    public static void main( String[] args )
    {
        // You can change the title or size here if you want.
        JFrame win = new JFrame("GraphicsDemo1");
        win.setSize(800,600);
        win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        GraphicsDemo1 canvas = new GraphicsDemo1();
        win.add( canvas );
        win.setVisible(true);
    }
}

感谢。 awt和swing对我来说非常困惑。

2 个答案:

答案 0 :(得分:3)

  

为什么要扩展画布?

因为曾经写过它的人选择这样做。只有那些从Component扩展的类才能实际绘制到屏幕上,并且只有当它们附加到有效的可见窗口时

  

这个程序什么时候调用了油漆?

绘画是RepaintManager的责任。它将决定何时需要重新绘制组件并在Event Dispatching Thread上安排重绘事件。这反过来会代表您调用(在您的情况下update调用)paint

您可能希望阅读Painting in AWT and Swing以了解有关该主题的更多详情

答案 1 :(得分:1)

只要控件失效并且需要重新绘制自己,就会调用

paint()。考虑将应用程序部分移出屏幕然后再移回。油漆将被调用重绘...

我想可以扩展一些不同的控件来实现相同的目标,基本上是创建一个自定义绘制的控件。扩展现有控件以获得在其表面上绘制,放置在JFrame中,自动重新绘制等的能力。