0

JFileChooser を閉じようとしています。次のスニペットの cancelSelection メソッドが 5 秒後に消えない理由を教えてください。

public static void main(String [] args){
    JFrame frame = new JFrame();
    frame.setVisible(true);
    final JFileChooser fchooser = new JFileChooser();
    fchooser.showOpenDialog(frame);
    try {Thread.sleep(5000);} catch (Exception e){}
    fchooser.cancelSelection();
}

どんな助けでも大歓迎です。

4

3 に答える 3

3

GUI の更新はイベント ディスパッチ スレッド (EDT) で行う必要があるため、これを行うにはスイング タイマーを使用する必要があります。

showOpenDialog() メソッドを呼び出す前にタイマーを開始する必要があります。

于 2013-03-29T03:01:48.407 に答える
2

の呼び出しshowOpenDialog()は、選択が行われるか、ダイアログがキャンセルされるまで返されません。タイムアウト後にダイアログを閉じたい場合は、別のスレッドでタイミングを行う必要があります。

于 2013-03-29T02:55:27.960 に答える
2

Swing Timer を使用する必要があることに同意しますが、ダイアログを無効化/非表示にするロジックがさらに必要な場合 (たとえば、利用可能なデータがなくなったときに閉じる必要があるプログレスバー)、SwingWorker を実装するか、次を使用します。

  public static void main(String... args) {
    JFrame frame = new JFrame();
    frame.setVisible(true);
    final JFileChooser fchooser = new JFileChooser();

    new Thread() {
        @Override
        public void run() {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {}

            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    // This is run in EDT
                    fchooser.cancelSelection();
                }
            });
        }
    } .start();

    fchooser.showOpenDialog(frame);
}
于 2013-03-29T04:00:41.880 に答える