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

While using JPanel, the result is not same that I expected

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。

因为 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

它只发生在帧调整大小时。 调整框架大小时,您的 paintComponent 将使用变量 "st" 的旧值再次调用。 这是因为,对于 class "tpanel","st" 是一个全局变量,并且直到您的 JPanel 保持打开状态,控制才会从 "tpanel" class 退出。

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

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