这是我问题的简单版本。
我有3节课:
公共类TopographyFrame扩展了JFrame-具有JPAnel和按钮的简单JFrame
公共类TopograpyPanel扩展JPanel-JPanel填充矩形
公共类Siec-执行计算并在JPAnale上调用重画的类

在JPanel我覆盖paintComponent()方法

public void paintComponent (Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        System.out.println(rectangles.length);
        for(int i = 0 ; i < rectangles.length ; i++){
            g2.setPaint(neurony[i].winner);
            g2.fillRect((int)rectangles[i].x,(int)rectangles[i].y,(int)rectangles[i].width, (int)rectangles[i].height);
        }
    }


神经元-带有野外公共色彩赢家的物体

在Siec类中,我引用了JPanel重新粉刷它
在类JFrame中,我有一个带有私有动作侦听器的按钮:

class MyListener implements ActionListener{
        Siec s;
        public MyListener(Siec s){
            this.s = s;
        }
        public void actionPerformed(ActionEvent arg0) {
            try {
                s.forPaint();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }


Siec中的forPaint()方法如下所示:

public void forPaint(){

        setTopography();

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        setTopography();
    }
public void setTopography() {
    for (int i = 0; i < vector.colors.length; i++) {
            neurony[i].winner = vector.colors[(int)(random() * 900 % vector.colors.length)];
    }
    panel.repaint();
}


vector.color是颜色的数组

所以我的问题是:当我单击一个按钮时,我想立即重绘JPanel,然后在3秒后重绘一次。插入的JPanel延迟3秒后仅重新绘制一次。
        }

最佳答案

您永远无法在事件处理线程上睡觉,等待或以其他方式暂停。这样做会阻止所有事件(包括绘画事件)的处理。您的第一幅画无法发生,因为您在事件线程上处于睡眠状态,因此无法进行。

进行任何类型的动画(甚至是诸如此类的简单操作)的正确方法是创建自己的线程。第二个线程可以调用repaint(),休眠3秒钟,然后再次调用repaint()。 SwingWorker类名义上是执行此操作的一种更简单的方法,但是老实说,初学者总是发现创建自己的线程更容易。

关于java - Java-在一种方法中重新绘制JPanel 2次,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10390124/

10-15 22:20