2016-07-13 10 views
0

Ich habe eine Aktion hinzugefügt eine JButton erstellt, ist nach meinem CodeSwing - JButton Text nicht auf setText reagiert()

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); 
} 

Während ich in der Lage bin, das System, um zu sehen, ist meine Komponente nicht immer überhaupt aktualisiert, mehr über Ich kann keine andere Komponente auf dem JFrame aktualisieren, als ob der gesamte Thread blockiert wäre

+4

'... als wäre der ganze Thread blockiert' Es ist. Swing ist single-threaded - mit dem SwingUtilities wird intensiver Swing-Code blockiert. Benutze einen separaten Thread oder einen SwingWorker – copeg

+0

Danke @copeg! Ich habe eine Antwort basierend auf Ihrem Rat hinzugefügt und erwähnt Sie – WiredCoder

Antwort

3

Die Antwort war, dass der Haupt-Thread wegen der singulären Natur des Swing-Haupt-Thread blockiert wird.

"Die Schaukel Single-Thread-Regel: Swing-Komponenten und Modelle sollten erstellt, geändert und abgefragt werden nur von dem ereignisse Dispatching Fäden."

-Java Concurrency in der Praxis.

Ich habe meinen Code aktualisiert den Blocker-Code in einem Swingworker aufzunehmen, wie unten beschrieben

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(); 
} 

Dank @copeg für mich die richtige Richtung setzen.

+0

Bitte [akzeptieren Sie die Antwort] (http://meta.stackexchange.com/a/5235/155831). Dies hilft den Leuten, es später zu finden. –

Verwandte Themen