2009-08-20 5 views

答えて

7

はい - もちろん可能です。あなたは休暇を予定しようとしましたか?

JFrame f = new JFrame(); 
final JDialog dialog = new JDialog(f, "Test", true); 

//Must schedule the close before the dialog becomes visible 
ScheduledExecutorService s = Executors.newSingleThreadScheduledExecutor();  
s.schedule(new Runnable() { 
    public void run() { 
     dialog.setVisible(false); //should be invoked on the EDT 
     dialog.dispose(); 
    } 
}, 20, TimeUnit.SECONDS); 

dialog.setVisible(true); // if modal, application will pause here 

System.out.println("Dialog closed"); 

上記のプログラムは、20秒後にダイアログを閉じますし、あなたがテキストが表示されますはコンソール

+2

イベントディスパッチスレッドでdialog.setVisisble(false)を呼び出す必要があります。それ以外の場合、コードの動作は予測できません。 –

+0

これは非常に真実です - 混乱の理由からこれを省略しました –

3

私はスイングタイマーを使用するに印刷された「ダイアログが閉じて」。 Timerが起動すると、コードはEvent Dispatch Threadで自動的に実行され、GUIへのすべての更新はEDTで実行されます。

How to Use TimersのSwingチュートリアルのセクションを読んでください。

14

このソリューションはoxbow_lakes 'に基づいていますが、このタイプのものを対象としたjavax.swing.Timerを使用しています。常にイベントディスパッチスレッド上でそのコードを実行します。これは微妙だが厄介なバグを避けるために重要です。

import javax.swing.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

public class Test { 

    public static void main(String[] args) { 
     JFrame f = new JFrame(); 
     final JDialog dialog = new JDialog(f, "Test", true); 
     Timer timer = new Timer(2000, new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       dialog.setVisible(false); 
       dialog.dispose(); 
      } 
     }); 
     timer.setRepeats(false); 
     timer.start(); 

     dialog.setVisible(true); // if modal, application will pause here 

     System.out.println("Dialog closed"); 
    } 
} 
関連する問題