2016-07-13 5 views
0

я действие добавленного к JButton создано, следуя моего кодSwing - JButton текст не отвечает на SetText()

private void myButtonActionPerformed(java.awt.event.ActionEvent evt) {            
    txtResult.setText(""); 
    myButton.setText("Working ..."); 
    myButton.setEnabled(false); 
    myButton.repaint(); 
    System.out.println("Doing Action ..."); 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { // some code inside that is memory intensive 
     } 
    }); 
    segmentButton.setText("Original Text"); 
    segmentButton.setEnabled(true); 
} 

В то время как я могу видеть систему, мой компонент не получает обновлено на всех, более того, я не могу обновить какой-либо другой компонент на JFrame, как если бы весь поток был заблокирован

+4

'... как будто вся нить заблокирована'. Качание однопоточное - размещение некоторого интенсивного кода на EDT с использованием SwingUtilities блокирует Swing от обновления. Используйте отдельную нить или SwingWorker – copeg

+0

Спасибо @copeg! Я добавил ответ на основании вашего совета и упомянул вас. – WiredCoder

ответ

3

Ответ был тот, что основной поток блокируется из-за необычной природы основного потока качания.

«правило Свинг одной нити: распашные компоненты и модели должны быть создания, изменения и запрашиваются только из диспетчеризации событий потока.»

-Java Параллельность на практике.

Я обновил свой код для размещения кода блокатора в SwingWorker, как описано ниже

private void myButtonActionPerformed(java.awt.event.ActionEvent evt) {            
txtResult.setText(""); 
myButton.setText("Working ..."); 
myButton.setEnabled(false); 
myButton.repaint(); 
System.out.println("Doing Action ..."); 
    SwingWorker worker = new SwingWorker() { 
     @Override 
     protected Object doInBackground() throws Exception { 
      //Memory intensive code 
     } 

     @Override 
     protected void done() { 
      segmentButton.setText("Original Text"); 
      segmentButton.setEnabled(true); 
      super.done(); //To change body of generated methods, choose Tools | Templates. 
     } 
    }; 
    worker.execute(); 
} 

Спасибо @copeg за поставив меня на правильном направлении.

+0

Пожалуйста, примите [ответ] (http://meta.stackexchange.com/a/5235/155831). Это помогает людям найти его позже. –