0

我有这段代码,但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();

   }
}
4

1 回答 1

0

[更新]以更好地适应问题:调用将repaint()aPaintEvent放入Event Queue。这PaintEvent将由另一个线程处理,即事件调度线程

简而言之:paintComponent()在另一个线程中调用作为您的主要方法。

[/更新]

我不确定您要达到什么目的,但请在main方法结束时尝试此操作:

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

这样的动线是你所期待的吗?这样做的原因:据我所知,Java Swing 可能会将在事件调度线程中排队的多个重绘请求折叠成一个单独的绘制请求——这可能是您所经历的。在我上面的例子中,等待 1 秒就足以获得不同的重绘。

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

也许您希望javax.swing.Timer定期更新 的值i然后触发重绘?

于 2013-05-06T17:19:57.673 回答