2009-08-20 2 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의 스윙 튜토리얼의 섹션을 읽어보십시오.

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"); 
    } 
} 
관련 문제