ボタンまたはボタンを押すと閉じることができる単純なダイアログを作成していましたEsc
。ダイアログを閉じる前に CountDownLatch を使用して待機し、.countDown()
さまざまなリスナーから呼び出しました。
次の問題に遭遇しました。ウィンドウ呼び出しで「X」を押す.countDown()
とダイアログが閉じられ、ボタンを押すと同じコードが呼び出されますが、スレッドは実行を再開しません。何が問題なのですか?
コンパイル可能/実行可能な例:
import java.util.concurrent.CountDownLatch;
import javax.swing.JFrame;
public class StrangeDialog extends javax.swing.JDialog {
final CountDownLatch latch = new CountDownLatch(1);
public StrangeDialog(JFrame parent) {
super(parent, true); // removing this line fixes things
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosed(java.awt.event.WindowEvent evt) {
System.out.println(latch);
latch.countDown();
}
});
setFocusable(true);
addKeyListener(new java.awt.event.KeyAdapter() {
public void keyReleased(java.awt.event.KeyEvent e) {
System.out.println(latch);
latch.countDown();
}
});
setSize(100,100);
setVisible(true);
}
public static void main(String[] args) {
StrangeDialog dialog = new StrangeDialog(null);
try {
dialog.latch.await();
} catch (InterruptedException ex) {
}
dialog.setVisible(false);
System.out.println("Released");
}
}