关于一段java程序的小问题,paint函数是什么时候执行的,没有调用啊
01 package xline;
02
03
04 import javax.swing.*;
05 import java.awt.*;
06
07 public class DrawLines extends JFrame {
08 /**
09 * @param args
10 */
11 public DrawLines() {
12 super("实验:直线、圆弧、多边形");//父类的构造函数调用
13 setSize(500, 500);
14 setVisible(true);
15 setResizable(false);
16 setLocationRelativeTo(null);
17 //show();
18 }
19
20 //为什么new产生一个对象的同时会执行此方法
21 public void paint(Graphics g) {
22 super.paint(g);//有什么用,试了下,可以去掉而不影响结果
23 // 直线演示
24 g.setColor(Color.BLUE);
25 g.drawLine(10, 10, 80, 150);
26 g.drawString("直线演示", 50, 50);
27
28 }
29
30 public static void main(String[] args) {
31 DrawLines demo = new DrawLines();
32 demo.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
33 // TODO 自动生成方法存根
34 }
35
36 } 展开
程序跑的结果是这样的:
找看看有没有此类
有没有main方法
有没有引入值(String[] args)
31行DrawLine 类的变数demo初始化,指到new DrawLines();
开始new DrawLines()
找到DrawLines的无引数构造函数
父类别(JFrame)的构造函数调用,我不知道里面他干了什么事。。。
执行下列函数(这些函数是父类别JFrame的,因为你没有复写):
setSize(500, 500);
setVisible(true);
setResizable(false);
setLocationRelativeTo(null);回到32行呼叫demo.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
程式结束
20 //为什么new产生一个对象的同时会执行此方法
很有可能的原因就是:
你复写了JFrame的Paint(Graphic g)函数
super("实验:直线、圆弧、多边形");
setSize(500, 500);
setVisible(true);
setResizable(false);
setLocationRelativeTo(null);这五个方法其中一个(或多个)调用了Paint(Graphic g)函数,所以他就会执行。
就是这样。
可以用api来探求程序内部做了什么吗,比如什么时候用什么调用的paint等等。我在api上找paint找到了好多。。。。怎么样把这段程序的整个流程捋一遍呢,希望学习其方法
你可以看jdk1.x.x_xx/src.zip,里面是各个包的Java代码,你可以找到javax.swing.JFrame.java档查看。
调用super.paint()就是为了除了绘制你需要定制的line之外,还要保证绘制这个组件自身的其它元素!因为在刷新、覆盖等操作中,这个组件需要被重新绘制。
paint()方法的调用是awt线程来控制的,jvm提供了这样一个线程来管理组件的各种工作。一旦这个组件被某个其它窗口覆盖之后,或者最小化最大化的过程中,组件本身都会接到awt的重绘事件申请,组件便调用paint()方法来绘制自身和add到组件之上的各种对象。
也就是说一旦发生变化,自动调用paint()进行重绘!