2009-11-25 33 views
5

En mi clase principal de la aplicación Tengo un objeto de JTextArea (digamos txtArea). He creado dos hilos más en el programa main_application. Los dos hilos que he creado son para leer y escribir en el puerto serie. Ahora quiero poner los datos del buffer de lectura del puerto serie en un objeto JTextArea. Así que necesito pasar el objeto JTextArea creado en main_application a read-thread para que read-thread pueda poner la salida de lectura a JTextArea.Cómo pasar objeto a partir de hilo conductor a otro hilo en Java

Pero después de hacer como esto estoy frente a un problema de acceso nula puntero. Cuando compruebo el objeto JTextArea en main_application, no es nulo, pero después de pasar al hilo, comprobé su nulo. No sé cómo sucede .... si cualquier geek me puede ayudar a ser feliz ....

Gracias, Surjya

+0

¿Cómo está pasando el objeto? ¿Puedes proporcionar una docena de líneas de código que demuestren tu problema? – Suppressingfire

Respuesta

1

objetos de compartición entre los hilos puede ser muy complicado, es posible que desee leer sobre el Actor model para un enfoque diferente. Específicamente en el campo de GUI, un código de acercamiento Model-View-Controller ayuda.

Pero de vuelta al la cuestión, se podría cortar rápidamente al hacer que su JTextArea una variable estática y simplemente dejar que todos los diferentes hilos de modificar la instancia estática a voluntad:

public static JTextArea TXTAREA 

void main_application(){ 
    //set up app 
    ... 
    TXTAREA = new JTextArea() 
    ... 
} 

entonces en el hilo de lectura en serie, establece el texto para TXTAREA. Esta solución no es ideal, creo que un mejor enfoque sería usar un enfoque MVC y tener un controlador que acepte el valor para poner en el área de texto.

+0

¿No debería 'TXTAREA' ser volátil? (descargo de responsabilidad: no he leído concurrencia java en la práctica todavía, pero está en mi lista de tareas :)) – wds

0
  1. Publicar JTextLa referencia de referencia a otro subproceso no es correcta porque los compiladores Swing están basados ​​en MVC (model-ui en realidad). Por lo tanto, su forma general de trabajar con componentes swing es actualizar sus modelos y dejar que view (ui) muestre el cambio;
  2. Otro punto es que la mayoría de los componentes de oscilación no son seguros para subprocesos, es decir, no puede estar seguro de que su aplicación funciona bien si utiliza el componente de oscilación de la rosca más allá de EDT;

Por lo tanto, usted debe hacer lo siguiente: cada vez que tiene nuevos datos para mostrar presentar nueva tarea de JTextArea actualización de contenido para ser ejecutado desde la EDT. Puede lograrlo a través de SwingUtilities.invokeLater()

2

Como se menciona en otra respuesta, solo puede cambiar el contenido de un componente Swing en el propio hilo oscilante. Una buena forma de asegurarse de que todos los demás subprocesos lo hagan es no exponer el JTextArea real, sino proporcionar a los otros objetos un método seguro para agregar texto al área de texto desde su aplicación principal, como sigue:

public class main_application {

private JTextArea txtArea; 

public void addText(final String txt) { 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      txtArea.setText(txtArea.getText() + txt); 
     } 
    }); 
} 

}

este es un ejemplo sencillo, pero se puede ampliar esto en función de sus necesidades. Esto también utiliza una forma más costosa de agregar texto ya que agrega dos cadenas inmutables. Puede usar JTextArea.getDocument() para recuperar el modelo y luego usar los métodos de mutación en el documento para actualizar el texto de manera más eficiente.Sin embargo, al proporcionar un método como este, puede cambiar la implementación en el futuro sin afectar sus otros hilos u objetos.

Tenga en cuenta que el parámetro txt es definitivo, por lo que se puede hacer referencia directamente en la clase interna anónima.

Quizás desee desacoplar esto de su clase de aplicación principal y crear una interfaz o clase para el/los método/camino (s) que desea manipular el área de texto de sus otros hilos y luego entregarles un objeto que envuelve este área de texto.

Cuestiones relacionadas