2017-08-22 31 views
0
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。虽然使用JPanel,但结果与我预期的不一样

我有一个原因,变量ST不能机能的研究里面的paintComponent生产,我必须得到结果0,1,(获得的paintComponent仅一次)

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

我不知道为什么这个代码打印0,1,2,3不是0,1

+0

我用BufferedImage – fnclovers

回答

0

它是框架调整大小只发生。 调整框架大小时,您的paintComponent会再次使用旧值“st”调用。 这是因为,对于类“tpanel”,“st”是一个全局变量,直到你的JPanel保持打开状态,控件不会退出“tpanel”类。

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

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

0

因为 paintComponent 被调用多次,每次面板得到画 它会打印一对夫妇的想法0,1为第一涂料,2,3为s的Econd


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

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 
+0

解决了这个问题是的,谢谢你的帮助。但是我在另一种情况下必须使用变量(st),并且我只想调用paintComponent一次。你没有想法吗? – fnclovers

+0

你不要调用paintComponent是调用它的swing框架,你不能做任何事情,我建议你阅读这个https://stackoverflow.com/a/15545309/2508770 – Emax

相关问题