Me encontré con el mismo problema con mi aplicación. Tenía un botón "Ejecutar" mi aplicación que realizaba algunas acciones y sacaba los resultados a un JTextArea. Tuve que llamar al método desde un hilo. Aquí esta lo que hice.
Tengo varios botones de opción que se pueden hacer, y luego un botón "Ejecutar" para ejecutar esa acción en particular. Tengo una acción llamada Validate. Entonces cuando verifico ese botón de radio y hago clic en el botón "Ejecutar", llama al método validate(). Así que primero puesto este método en una clase interna que implementa Ejecutable
class ValidateThread implements Runnable {
public void run() {
validate();
}
}
luego me llamó a este hilo en el ActionListener del botón "Ejecutar", como así
runButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
// Some code checked on some radio buttons
if(radioButton.isSelected()) {
if(radioButton.getText().equals("VALIDATE")) {
Runnable runnable = new ValidateThread();
Thread thread = new Thread(runnable);
thread.start();
}
}
}
});
Voila! La salida ahora se envía a JTextArea.
Ahora, notará que JTextArea no se desplazará hacia abajo con el texto. Así que hay que ajustar la posición de intercalación como
textArea.setCaretPosition(textArea.getText().length() - 1);
Ahora, cuando los datos se añaden a la JTextArea, siempre se desplazará hacia abajo.
¿Por qué no utilizar EventQueue.invokeLater (ejecutable)? –
No estoy seguro de que estuviera disponible - su comentario fue 4 años después de que mi lol – Ascalonian