1

Swing for Java 1.5 では、ユーザーがバックグラウンドで他のことを実行できるようにするダイアログを作成したいと考えています。このダイアログには、ダイアログを閉じることができる 1 つのボタンが必要です。ユーザーが X 秒以内にダイアログを閉じない場合は、自動的に閉じる必要があります。どちらの場合も、ダイアログを閉じた後にルーチンを実行する必要があります。

モーダル ダイアログで Swing Timer を使用しようとしましたが、動作します。しかし、上で気づいたように、非モーダル ダイアログが必要です。modal-Property を false に設定すると、ダイアログがすぐに消えます。

なぜこれが起こるのか、誰かが知っていますか?

JOptionPane pane =  new JOptionPane (text, JOptionPane.WARNING_MESSAGE);
pane.setOptions(new String[]{"Close"});
final JDialog dialog = pane.createDialog(frame, title);
//dialog.setModal(false);

Timer timer = new Timer(time, new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        dialog.setVisible(false);
    }
});
timer.setRepeats(false);
timer.start();

dialog.setVisible(true);

//routine to do after the dialog disappears
4

2 に答える 2

2

この例では、直接JDialogを含むモードレスは、閉じる前にゼロまでカウントダウンします。ラベルを含む近くは応答性を維持します。 JOptionPaneJFrame

補遺:@mKorbelが有益なコメントとして、クラスPropertyChangeListenerはダイアログのオプションペインがいつ閉じるかを学習するためにを使用できます。これはの便利な機能ですが、ここJOptionPaneに示すように、独自のサポートを追加できます。

画像

于 2012-10-02T16:36:13.710 に答える
2
  1. SSCCEをより早く投稿するためのより良いヘルプのために、コードや説明はありませんMultiThreading

  2. 実行時に作成しないでくださいfinal JDialog dialog = pane.createDialog(frame, title);。これJDialogを一度作成して別のアクションに再利用するか、すべての子をから削除してください。ContentPane

  3. WindowListenerからの適切なイベントをオーバーライドします。そこでdipose()setVisible()eiの前にカスタムコードを呼び出すことができます。

  4. (2番目を指す) JDialog#setDefaultCloseOperationをオーバーライドするだけHIDE_ON_CLOSE

  5. 実行時にnewを呼び出すすべてのコードは、特にTop-Level Containerにラップする必要がありますinvokeLater()setVisible(true)

  6. @camickrによるApplicationInactivityを使用する

于 2012-10-02T12:30:32.080 に答える