import java.awt.*;
import javax.swing.*;public class drawcolor extends JFrame
{
public drawcolor()
{
super("my frame!");
setSize(500,500);
setVisible(true);
}
//输出不同颜色的矩形和字符串
public void paint(Graphics g)
{
super.paint(g);

g.setColor(new Color(250,0,0));
g.fillRect(20,50,50,20);
g.drawString("It is red!"+g.getColor(),80,50);

g.setColor(new Color(0,250,0));
g.fillRect(20,80,50,20);
g.drawString("It is green!"+g.getColor(),80,80);

g.setColor(new Color(0,0,250));
g.fillRect(20,110,50,20);
g.drawString("It is blue!"+g.getColor(),80,110);

}



public static void main(String[] args)
{
drawcolor color1 = new drawcolor();
color1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}请问一下main方法没有调用paint函数啊,怎么运行时会创建paint里的内容啊?

解决方案 »

  1.   

    没画出来时因为paint()应该画在面板上paint会自动调用的如果要在别的函数中调用
    可以用repaint()
      

  2.   

    首先,提醒楼主一下,你写的这个类:“drawcolor” 首字母怎么是小写,约定俗成的不是首字母大写吗?不知是楼主手误,还是没有意识到,给楼主提醒一下:类名首字母应该大写!现在来回答一下楼主的问题:
        java中paint方法的调用一般是由repaint方法来调用而间接执行的,当某个类的对象执行了某项操作而改变了桌面上的图像时,jvm就会收到图像被改变的信息,会调用visible为true的组件的repaint方法来进行重绘,当然重绘的时候可以整个界面全部重绘,也可以只绘制改变的部分,对此,java的运行机制中已经进行了优化;当然你也可以自己手动调用paint方法,当不建议这么做,你可以调用repaint间接调用paint,有的文章说直接调用paint次数多了会导致图形进程卡在与显示器的交互上,用repaint目的在于安全,对此不清楚
        至于到底是在哪儿调用的paint方法,不用过于深究,有人说,“你所找到的jdk里所有带paint的代码段都不是paint的最终被调用的地方”,好像还牵扯到图形进程队列(AWTEventQueue),我不是很清楚,我觉得这不是我们应用的重点。
        在进行图形化编程时,只要记住一点:找到要继承的类,继承,重写paint等方法,需要刷新界面时记得调用repaint方法就成了,当然,实现双缓冲时,可以重写repaint方法来进行简单的实现个人觉得你这个问题问的太大了,有点太宽泛了,不知我写的这些你看明白了多少,我自己看的都头大,我的观点在于用,会用即可!
      

  3.   

    二楼的建议谢啦!命名class时确实失误啦,主要是才自学不久.对于api的调用确实感到头痛啊!!