使用JPanel时,结果与我预期的不一样

时间:2017-08-22 11:41:28

标签: java jpanel

package getcm;

import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class test {
    public static void main( String[] args ) {
        tpanel panel = new tpanel();
        JFrame app = new JFrame();
        app.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        app.add(panel);
        app.setSize(250, 250);
        app.setVisible(true);
    }
}
class tpanel extends JPanel {
    int st = 0;
    public void paintComponent(Graphics g) {
        for (int h = 0; h < 2; h++) {
            System.out.println(st);
            st += 1;
        }
    }
}

我认为这个结果应该是0,1但是在Eclipse中,打印的数据是0,1,2,3。

我有一个原因是变量st不能在paintComponent中产生,我必须得到结果0,1。(只获得paintComponent一次)

请帮助我得到结果0,1。

我不知道为什么这段代码会打印0,1,2,3而不是0,1。

2 个答案:

答案 0 :(得分:0)

由于 paintComponent 每次面板涂漆时都会多次调用 它会打印一些数字0,1用于第一次涂漆,2,3打印第二次

如果您编辑这样的代码,它将打印

class tpanel extends JPanel {
    int st = 0;
    public void paintComponent(Graphics g) {
        for (int h = 0; h < 2; h++) {
            System.out.println(st);
            st += 1;
        }
        Systen.out.println("paintComponent completed");
    }
}

输出:

0
1
paintComponent completed
2
3
paintComponent completed

答案 1 :(得分:0)

仅在帧大小调整时才会发生。 调整框架大小时,将使用变量&#34; st&#34;的旧值再次调用paintComponent。 这是因为,对于班级&#34; tpanel&#34;,&#34; st&#34;是一个全局变量,直到您的JPanel保持打开状态,控件才会退出&#34; tpanel&#34;类。

所以简单地说它只打印在paintComponent的不同函数调用之间调用的全局变量的值。

希望这会有所帮助。 : - )