2013-03-29 50 views
0

我想關閉JFileChooser。你能不能,請讓我知道爲什麼下面的代碼片段的cancelSelection方法不會使5秒鐘後消失它:JFileChooser不會消失後cancelSelection()

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(); 
} 

任何幫助深表感謝。

+2

方法'JFileChooser.showOpenDialog()'阻塞,直到文件選擇器窗口關閉 –

+0

我簡化了這個問題。 cancelSelection從另一個不同於事件派發的線程調用。使用定時器解決了這個問題。 – klearn

回答

3

您應該使用Swing Timer來做到這一點,因爲更新GUI應該在事件調度線程(EDT)上完成。

您需要在調用showOpenDialog()方法之前啓動計時器。

+0

這個例子不夠好。 cancelSelection()運行在與EDT不同的單獨線程中。通過Timer將cancelSelection放入EDT解決了這個問題。謝謝。 – klearn

2

showOpenDialog()的調用將不會返回,直到做出選擇或對話框被取消。如果你想在超時後關閉對話框,你將不得不在另一個線程中進行計時。

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); 
}