2013-04-24 1 views
0

У меня есть событие onClick в Java Swing.Показать анимацию загрузки во время события onclick в java swing onclick

private void fastForward(java.awt.event.MouseEvent evt) { 
    loading.setVisible(true); 
    //some time consuming algorithm 
    loading.setVisible(false);  
} 

В нем я выполняю операцию, которая потребляет много времени, поэтому я хочу отображать анимацию загрузки.

Я создал один из них как кнопку со значком, который загружает gif, я установил видимость кнопки на false. В событии onClick я установил видимость в значение true. Проблема в том, что кнопка становится видимой, когда выполняется целая функция, чего я не хочу. Я хочу, чтобы кнопка отображалась во время выполнения функции. Как я могу настроить кнопку на видимую во время выполнения.

+0

Что такое 'onClick' событие? Я не знаю о событии Swing этого имени. – camickr

ответ

4

Это потому, что только после того, как поток пользовательского интерфейса освободится, он может обновить интерфейс. Это то, что вам нужно сделать:

private void fastForward(java.awt.event.MouseEvent evt) { 
    loading.setVisible(true); 
    new Thread(new Runnable(){ 

    @Override 
    public void run(){ 
     //time consuming algorithm. 
     if(done){ 
     SwingUtilities.invokeLater(new Runnable(){ 
      @Override public void run(){ 
       loading.setVisible(false);  
      } 
      }); 
     } 
    } 

    }).start(); 
} 

Над чем это происходит:

  1. UI нить устанавливает статус загрузки.
  2. Пользовательский интерфейс запускает новую тему для выполнения команды. После этого вызова поток пользовательского интерфейса свободен.
  3. Новая тема вычисляет алгоритм
  4. После того, как новый поток не будет сделано, он запрашивает поток пользовательского интерфейса для обновления пользовательского интерфейса

Таким образом, кнопка не получите заморожена. И по завершении, поток пользовательского интерфейса обновляется.

+0

+1 для неподвижного и правильного пути – mKorbel

+0

+1. Но я не думаю, что существует 'SwingUtilities.runLater'. Вероятно, вы имели в виду 'SwingUtilities.invokeLater'. –

+1

@GuillaumePolet Спасибо. Обновлено. Я работаю с 'JavaFX' для когда-то сейчас, и он имеет' Platform.runLater() ', поэтому написал это ошибочно. – Jatin

2

Попробуйте использовать SwingWorker

Она имеет во встроенной функциональности повторной синхронизации с Event диспетчерской темы через использование publish/process методов. Это легко узнать, когда его done и имеет возможности обновления прогресса

Взгляните на this, this и this для примеров

Смежные вопросы