Java:repaint()不工作?

时间:2014-04-09 16:16:14

标签: java

代码:

@Override
    public void mouseReleased(MouseEvent e) { //when the mouse is pressed
        Point where=e.getPoint();
        int x=(where.x-3)/20+1;
        int y=(where.y-30)/20+1;
        if(x>=1&&x<=30&&y>=1&&y<=30)
        {
            v[x][y]=1-v[x][y];
            repaint();
            try{
            TimeUnit.MILLISECONDS.sleep(300);
            }
            catch(Exception ex){}
            redo();
            repaint();
        }
    }

绘制功能,使其在屏幕上显示V矩阵的所有30x30元素。重做功能对V进行了一些更改(细节无关紧要)。

我想要做的是绘制V的元素,但是当v [x] [y]改变时,等待0.3秒,然后再次绘制V的元素,但是这次它们被重做后更改功能。但重画只在第二次起作用,第一次没有做任何事情。

1 个答案:

答案 0 :(得分:1)

睡眠将阻止事件驱动线程(EDT) - 尽量不要在应用程序的主线程中休眠。 EDT将渲染您的框架/对话框/面板,并将响应点击和菜单以及键盘输入。在这个线程上只做快速任务非常重要。

如何添加Timer对象以便稍后运行代码?

  Timer timer = new Timer(300, new ActionListener(){

     @Override
     public void actionPerformed(ActionEvent e) {
         SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
               // runs code on the EDT to edit UI elements (recommended way)
               redo();
               repaint();
            }

         });  
     }
  });
  timer.setRepeats(false);
  timer.start();

因此Timer对象将创建一个新线程,延迟300毫秒,然后调用'actionPerformed'方法。这将发生在Timer的线程上。不建议从除EDT之外的任何线程更改UI元素,因此我们使用invokeLater方法导致swing在EDT本身上运行runnable - 所以回到原始线程。