我是否正确,为什么一件事有效,为什么我以前拥有的东西不起作用?(关于线程)



我正试图使此按钮禁用其他两个按钮并同时执行图形化操作。这是我尝试的第一件事:

public void actionPerformed(ActionEvent arg0) {
    reset.setEnabled(false);
    switcher.setEnabled(false);
    for (int i = 0; i < 10; i++){
            a.change();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
            return;
        }
    }
}

所以这是按钮上的actionperformed方法我试图编码和switcher和reset是我禁用的按钮,和a.c change()应该引起视觉效果。当我尝试这个时,整个程序停止了十秒钟,然后按钮被禁用,在这十秒钟内没有任何视觉效果。然后我试了:

public void actionPerformed(ActionEvent arg0) {
    reset.setEnabled(false);
    switcher.setEnabled(false);
    if (!s.isAlive()){
        s = new Thread(new Changer());
        s.start();
    }
    else{
        s.interrupt();
    }
}

Where Changer is:

private static class Changer implements Runnable {
    public void run() {
        for (int i = 0; i < 10; i++){
            a.change();
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
                return;
            }
        }
    }
}

这正是我想要的,按钮立即被禁用,然后是视觉效果。这样做的原因是actionperformed的所有效果在退出函数时激活,所以第一种方式,它将十秒钟为actionperformed结束,并且它将在结束时禁用和十个a.c echange ()s ?第二种方法是在开始s后解决,所以按钮禁用,然后s继续,它的效果在actionperformed结束后?

可以。

有一个单一的UI线程管理事件和重画(更新屏幕)。在你的第一次尝试中,你让它睡着了。这样做意味着在它唤醒之前不会发生任何其他事情(关于UI)。

是。你是对的。

最新更新