2012-07-18 10 views
5

Tengo un problema con mi JButton ActionListener. Tengo un método doTheCleaning() definido en otra clase que cuando se llama hace una serie de cambios a mi GUI.JButton ActionListener - Actualizaciones de GUI solo después de hacer clic en JButton

public void doTheCleaning(){ 
    //change image icon 
    //had thread.sleep here 
    //insert to text area 
    //had thread.sleep here 
    //etc 
} 

Luego, en otra clase, que instanciado la clase que contiene el método de mi doTheCleaning() y tenía mi ActionListener escrito con mi método actionPerformed() para mi JButton escribe así:

public void actionPerformed(ActionEvent e){ 
    //some code 
    //newClass.doTheCleaning(); 
} 

Sé cómo hacer el resto como addActionListener() y cosas así que no hay necesidad de cuestionar sobre eso. Mi preocupación es que todos los cambios en mi GUI que se realizan cuando se llama al método doTheCleaning() se aplican solo después de hacer clic en el botón. Cuando esto sucede, no se muestra la sucesión entre los cambios que ocurrieron en mis etiquetas y en el área de texto. El código funciona bien si lo llamé directamente en mi clase de prueba pero al llamarlo dentro del método actionperformed solo se muestra el estado final de mi GUI. Necesito mostrar qué elemento cambió primero, luego qué sigue, y así sucesivamente.

¿Cómo puedo lograrlo cuando necesito que estos cambios ocurran solo cuando hago clic en JButton?

** Todavía no soy tan bueno haciendo GUI en Java. Espero que hayan entendido mi punto sin que yo haya dado mi código. pero podría si es necesario. Gracias.

+0

¿Quiere decir que tiene varios cambios en las etiquetas y áreas de texto y desea que sucedan uno por uno con el usuario viendo cada paso? – darrenp

+0

Para facilitar la lectura, siga las reglas de ortografía (la primera letra de una oración debe escribirse con mayúscula :-) – kleopatra

+2

No use 'Thread.sleep (...)' como las llamadas dentro de su código GUI. En su lugar, utilice [javax.swing.TImer] (http://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html) para este fin, puede ser que no actualice sus cosas en el EDT - Hilo de envío de eventos , esto podría ayudarte en eso :-) –

Respuesta

12

No realice ninguna operación intensiva dentro de EDT, de lo contrario, la GUI no responderá y es posible que no vea las actualizaciones de la GUI. La mejor opción que puede utilizar es SwingWorker:

Para obtener más información, lea Concurrency in Swing.

+1

Esta es una buena explicación :-) –

+5

De acuerdo, 1+. También lo he editado para agregar un enlace [Concurrency in Swing tutorial] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html). –

+0

@HovercraftFullOfEels Gracias. –

Cuestiones relacionadas