2015-02-09 2 views
2

Я хочу отобразить текст перед выполнением функции mediaPlayer(). Во время выполнения медиапланера я сплю нитку. Это нормально, потому что тогда ничего не должно произойти (тогда просто нужно слушать).Сон нить java, но сначала обновить jFrame

Однако последний текст: «Слушать ...» не отображается (за исключением нескольких секунд задержки). Есть ли способ очистить jFrame перед тем, как нить заснет?

expText.setText("Listen to the song and give a rating when it finishes."); 

        startButton.setEnabled(false); 


        //play sound 
        try { 
         mediaPlayer(); 
         //wait for the duration of the stimuli 
         Thread.sleep(stimDuration); 
        ... 
+0

Да: никогда не выполняйте длительные операции с потоком пользовательского интерфейса. Вызовите 'mediaPlayer' в фоновом потоке или перепишите его как асинхронный. –

+1

Вы не хотите обертывать SwingWorker в таймер, это просто ... странно. Просто используйте SwingWorker для воспроизведения звука. Взгляните на [этот пример] (http://stackoverflow.com/questions/24274997/java-wav-player-adding-pause-and-continue/24275168#24275168) – MadProgrammer

+0

Что значит MediaPlayer и dhow? Какова цель задержки? – MadProgrammer

ответ

1

Следующее комбинированное использование Threads and Swing Timer решило проблему.

  Thread t2 = new Thread(new Runnable() { 
         public void run() { 
          try { 
           startButton.setEnabled(false); 
           startButton.setVisible(false); 
           buttonsPanel.setEnabled(false); 
           buttonsPanel.setVisible(false); 
           expText.setText("Listen to the song and give a rating when it finishes."); 
          } catch (Exception e1) { 
           e1.printStackTrace(); 
          } 
         } 
        }); 
        t2.start(); 




        Thread t1 = new Thread(new Runnable() { 
         public void run() { 
          // code goes here. 
          try { 
           mediaPlayer(); 
//        Thread.sleep(5000); 


          } catch (Exception e1) { 
           e1.printStackTrace(); 
          } 
         } 
        }); 
        t1.start(); 

        ActionListener taskPerformer = new ActionListener() { 
         public void actionPerformed(ActionEvent evt) { 
          //...Perform a task... 

          resultButtonGroup.clearSelection(); 
          startButton.setEnabled(true); 
          startButton.setVisible(true); 
          buttonsPanel.setVisible(true); 

         } 
        }; 
        Timer timer = new Timer(stimDuration ,taskPerformer); 
        timer.setRepeats(false); 
        timer.start(); 
2

SetText не будет отображаться до тех пор, пока EDT делает еще один кадр, который он не может сделать, потому что он занят спит на stimDuration количество времени.

Попробуйте воспроизвести звук в отдельном потоке, воспроизвести звук на каком-либо другом потоке, обнаружить, когда звук остановится, а затем выполнить другое действие на EDT, где вы меняете expText назад к исходному тексту, который у вас был.

+0

Невозможно обойти это без явного определения многопоточности? Я не эксперт в этом, поэтому я спрашиваю. Я просто хочу, чтобы программа немного подождала. Таймер качания тоже казался вариантом, но я не мог понять. – dorien

+0

@dorien Возможно, используйте что-то вроде этого http://stackoverflow.com/a/782309/3352285, чтобы избежать явного создания и обработки трюков и Runnables самостоятельно. – NESPowerGlove

+0

Спасибо, я просто попробовал это, но в методе done() я не могу получить доступ к моему startButton, потому что он находится в другом классе. – dorien

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