2013-05-06 84 views
0

我有这个代码,但JPanel重绘方法不起作用。如果我将它添加到JFrame类后,我会调试它,它不记得paintComponent添加自定义JPanel到JFrame后重绘方法

这是为什么?

package trial; 

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


class jp extends JPanel 
{ 
    int i=0; 

    { 
     setBackground(Color.RED); 
    } 

    @Override 
    protected void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     Color[] c={Color.red,Color.green}; 
     //To change body of generated methods, choose Tools | Templates. 
     g.drawLine(i, i, i+100, i+100); 
     i+=50; 
    } 
} 

public class Trial extends JFrame{ 

    public static void main(String[] args) { 
     Trial f=new Trial(); 
     jp a; 
     a=new jp(); 
     System.out.println(a.i); 
     f.add(a); 
     f.setVisible(true); 
     f.setSize(500, 500); 
     f.setDefaultCloseOperation(3); 

     a.repaint(); 

    } 
} 
+0

为什么你有两个{{在保护void paintComponent(Graphics g){{...}} – user2277872 2013-05-06 16:43:39

+2

为代码块使用一致的逻辑缩进。代码的缩进旨在帮助人们理解程序流程。 – 2013-05-06 16:49:27

+0

我刚刚在我的机器上测试了它,在'paintComponent(Graphics g)'方法中设置了一个调试点,并且程序按照预期进入了调试模式。 – lwi 2013-05-06 17:04:47

回答

0

[更新]以更好地适应这样的问题: 的调用repaint()地方PaintEvent事件队列。这PaintEvent将由另一个线程,事件调度线程处理。

总之:在另一个线程中调用paintComponent()作为主要方法。

[/ UPDATE]

我不知道你想什么才达到,但这种尝试在你main方法的末尾:

try { 
     while (true) { 
      Thread.sleep(1000); 
      a.repaint(); 
     } 
    } catch (InterruptedException e) { 
    } 

是一个移动的行这样什么你在期待什么?这是工作的原因:据我记得,Java Swing可能会崩溃多个重新绘制请求,这些请求将在事件调度线程中排入一个绘制请求 - 这可能是您遇到的情况。在我上面的例子中,等待1秒就足以得到不同的重绘。

不过,我强烈建议您不要使用我的(或您的)代码。原因:i的值取决于paintComponent的调用次数 - 可能会有所不同。例如,拉一个角来调整窗口大小 - 重绘可能会被调用几十次!

也许你想要一个javax.swing.Timer定期更新值i,然后触发重绘?

+0

我的问题是“为什么”a.repaint“在我的主代码的最后一行不记得“paintComponent”方法吗? – Aladdin 2013-05-06 19:14:32

+0

看来你需要对Java Swing有一些基本的了解。 – fjf2002 2013-05-06 20:45:24

相关问题