java - 如何通过 GUI 使用 sleep(或类似 sleep 的东西)

标签 java swing user-interface thread-sleep

我在我的应用程序中使用 java swing。下面是我的代码片段。但是我知道 Thread.sleep() 不应该与 swing 一起使用。我读了一些帖子,说要使用 javax.swing.timer 中的 Timer 但对于下面的代码我不知道如何实现它。

public void mouseClicked(MouseEvent e) {
     try{
        demo.main("Welcome");
        Thread.sleep(900);
        demo.main("Argument to main");
        Thread.sleep(900);
        demo.main("Argument to main");

        // after this I call a method say `xyz` which also uses Thread.sleep() 
        // and this `xyz` method uses variables that are updated in `demo.main()`

       }catch(Exception e){
           e.printStackTrace();
   }  

如何实现与 sleep 相同的行为?

编辑:

  • demo.main() 不会更新 GUI,但 xyz() 会根据情况更新 GUI demo.main()
  • 中更新的变量
  • 我想首先在单击鼠标时调用 demo.main() ,一分钟后我想在一分钟后再次调用它。完成此操作后,我想调用另一个方法 xyz() ,该方法也使用 thread.sleep() 并使用 demo.main() 中更新的变量

最佳答案

我将使用 ScheduledExecutorService 和一个有序的操作列表。使用 enum 对此很有帮助。然后,这个enum可以实现一个简单的功能接口(interface)

ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);

enum ClickAction {
    Action1(900) {
        @Override
        void execute() {
            message("Welcome");
        }

    },
    Action2(900) {
        @Override
        void execute() {
            message("Another message");
        }

    };
    private final int delayAfter;

    private ClickAction(int delayAfter) {
        this.delayAfter = delayAfter;
    }

    abstract void execute();
}

private static void message(String msg) {
    System.out.println("msg=" + msg);
}

public void mouseClicked(MouseEvent e) {
    int delay = 0;
    for (ClickAction action : ClickAction.values()) {
        // Schedule it.
        executor.schedule(() -> {
            action.execute();
        }, delay, TimeUnit.MILLISECONDS);
        // Add up all of the delays.
        delay += action.delayAfter;
    }
}

关于java - 如何通过 GUI 使用 sleep(或类似 sleep 的东西),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36573986/

相关文章:

java - 使用java.util.Scanner验证输入

有界队列的 Java 线程池

Java applets 哪种布局适合这种界面?

java - jlabel 更改其文本之前计时器暂停

iphone - 根据动态tintColor 生成CGGradient

css - (固定宽度)与(可变宽度)网站设计

java - JAVA如何通过手工编码制作GUI?

java - 强制 Java 泛型参数为同一类型

java - 如何修复tomcat org.apache.tomcat.util.http.parser.HttpParser.<clinit> Character [[] is not allowed and will continue to reject

java - 用 Java 构建棋盘