Java:重绘()不起作用?

标签 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 元素。 redo函数对V做了一些改变(细节无关)。

我想做的是绘制 V 的元素,但 v[x][y] 发生变化,等待 0.3 秒,然后再次绘制 V 的元素,但这次是在它们被重做函数更改之后。但重画只在第二次有效,第一次什么也不做。

最佳答案

sleep 将阻塞事件驱动线程(EDT) - 尽量不要在应用程序的主线程中 sleep 。 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'方法。这将发生在计时器的线程上。不建议从除 EDT 之外的任何线程更改 UI 元素,因此我们使用 invokeLater 方法,该方法会导致 swing 在 EDT 本身上运行可运行对象 - 因此回到原始线程。

关于Java:重绘()不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22968313/

相关文章:

java - 如何使用 bash 在一个 jar 中执行多个 java 类文件

Java 套接字 : One Server and Multiple Clients

java - spring-XD 不读取 logback.xml

java - NetBeans:在 Web 模块的 EJB 模块中使用 EJB

java - AWS Java SDK 传输管理器仅下载文件夹结构

java - Android Studio 自动补全

java - TextArea 溢出分配给它的边界以及 Borderlayout 的中心并覆盖整个窗口

java - 什么情况下JVM会重启

java - 如果连接列包含有条件的数据,如何在 JPA 中检查

java - 无法在 Liberty 中设置 keyStore(.p12 扩展名)