2013-03-29 2 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, так как обновления для графического интерфейса должны быть выполнены в потоке отправки событий (EDT).

Вам необходимо запустить таймер ПЕРЕД вызовом метода showOpenDialog().

+0

Пример не достаточно хорош. cancelSelection() работает в отдельном потоке, отличном от EDT. Помещение cancelSelection в EDT с помощью таймера решило проблему. Благодарю. – klearn

2

Вызов showOpenDialog() не возвращается до тех пор, пока не будет сделан выбор или диалог не будет отменен. Если вы хотите закрыть диалоговое окно после таймаута, вам нужно будет выполнить синхронизацию в другом потоке.

2

Я согласен с тем, что вы должны использовать таймер Swing, но если вам нужно больше логики, когда нужно отключить/отменить диалог (например, панель прогресса, которая должна закрываться, когда больше нет данных), либо используйте 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); 
}