如何使用GUI进行睡眠(或类似睡眠)

时间:2016-04-12 12:56:36

标签: java swing user-interface thread-sleep

我在我的应用程序中使用java swing。下面是我的代码。但是我知道Thread.sleep()不应该与波动一起使用。我阅读了一些帖子,说明要使用来自Timer的{​​{1}}但是对于下面的代码,我不知道如何实现它。

javax.swing.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(); } 不会更新GUI,但demo.main()会更新GUI 变量在xyz()
  • 中更新
  • 我想在点击鼠标时首先调用demo.main(),一分钟后我想在一分钟后再次调用它。在完成此操作后,我想调用另一个方法demo.main(),该方法也使用xyz()并使用thread.sleep()
  • 中更新的变量

3 个答案:

答案 0 :(得分:1)

我会使用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;
    }
}

答案 1 :(得分:0)

我会简单地产生一个新线程,例如(最简单的例子)

Thread t = new Thread(new Runnable() {
   public void run() {
     demo.main("Welcome");
     Thread.sleep(900);
     demo.main("Argument to main");
     Thread.sleep(900);
     demo.main("Argument to main");
   }
});
t.start();

因为您不想阻止Swing更新线程(正如您所指出的那样)。以上将在后台线程中调用您的demo类。我可能会调查Java multithreading further - 如果您有更复杂的要求,您可能希望使用比此处提供的简单Thread对象更高级别的构造。

答案 2 :(得分:0)

CountDownLatch可以做你想做的事。

例如:

public void mouseClicked(MouseEvent e) {
    try{
        final CountDownLatch latch = new CountDownLatch(1);
        demo.main("Welcome", latch);
        latch.await();
    }catch(Exception e){
        e.printStackTrace();
    }
}

然后在主要部分,你会致电latch.countDown()继续等待。