CountDownLatch导致JFrame(JButtons等)中的内容消失,只有在鼠标被覆盖时才会返回

时间:2014-02-18 02:25:03

标签: java multithreading swing synchronization jframe

我正在处理用户界面的交易或不处理。我遇到的第一个问题是如何等待按钮操作继续,我使用Count Down Latches并且它工作得很好。但无论何时,我点击一个按钮,我的JFrame中的所有内容都会消失,当你按下鼠标时它会回来,当我按下另一个按钮时突然重新出现(这在我使用Count Down Latches之前从未发生过,这也发生在Semaphores上,等等。我会尽量保持我的代码尽可能相关。

    public CountDownLatch cdl = new CountDownLatch(1);
    pickFirst();
    try {
        cdl.await();
    } catch (Exception E) {
    }
    while (banker.findCasesLeft() > 2) {
        banker = new Banker(Main.f.values);

        for (i = casesToPick; i >= 1; i--) {
            cdl = new CountDownLatch(1);
            pickCase();
            picked = false;
            try {
                cdl.await();
            } catch (Exception E) {
            }
        }

^^^那是我的班级处理挑选案例下面是带有actionlisteners的班级

public void actionPerformed(ActionEvent ae) {
    if (!Main.me.pickedFirst) {
        Main.me.pickedCase = caseNo;
        Main.f.log += "You picked to keep case " + caseNo + ".\n";
        setText(caseNo + "\np");
        Main.f.changeLog();
        Main.me.pickedFirst = true;
        Main.me.cdl.countDown();
    } else {
        int value = Main.me.values[caseNo-1];
        Main.me.values[caseNo] = 0;
        Main.f.values[getIndex(value)].setSelected(true);
        Main.f.log += "You picked to get rid of case " + caseNo + ". It contained $" + value + ".\n";
        Main.f.changeLog();
        Main.me.picked = true;
        Main.me.cdl.countDown();
    }
    setEnabled(false);
}

1 个答案:

答案 0 :(得分:2)

请注意CountDownLatchawait()方法“导致当前线程等到锁存器倒计数到零。”如果该线程是event dispatch thread,则GUI更新将被阻止,直到等待条件发生变化。通常,CountDownLatch意味着允许单独的线程会合;它不应该用于事件调度线程中。这个完整的example协调了多个SwingWorker实例,可能有助于澄清用法。