将自定义JPanel添加到JFrame后重绘方法

时间:2013-05-06 16:40:08

标签: java swing user-interface jpanel

我有这段代码,但JPanel重绘方法不起作用。如果我在将它添加到JFrame类之后执行此操作,我会调试它并且它不会调用paintComponent

为什么会这样?

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();

   }
}

1 个答案:

答案 0 :(得分: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的值,然后触发重新绘制?