2013-03-29 51 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); 
}