0

ボタンまたはボタンを押すと閉じることができる単純なダイアログを作成していました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");
    }

}
4

1 に答える 1

3

モーダルダイアログを作成しています。StrangeDialog dialog = new StrangeDialog(null);基本的に、コードはウィンドウが閉じるまで進行しません。

試す:

final StrangeDialog dialog = new StrangeDialog(null);
SwingUtilities.invokeLater(new Runnable() { public void run() { dialog.setVisible(true); } });

main()でウィンドウを開くと、期待どおりに機能します。

于 2012-10-13T06:03:47.433 に答える