Pregunta

Tengo el siguiente programa Java que se inicia en aproximadamente el 50% de todos los intentos de lanzamiento. El resto del tiempo se mete al punto muerto en segundo plano sin mostrar ninguna GUI. Tracé el problema al método SetText del objeto JTextArea. Usar otra clase como JButton funciona con SetText pero JtexTarea Deadlocks. ¿Alguien puede explicarme por qué está sucediendo esto y qué está mal con el siguiente código:

public class TestDeadlock extends JPanel {
private JTextArea text;
TestDeadlock(){
    text = new JTextArea("Test");
    add(text);
    updateGui();
}
public static void main(String[] args){
    JFrame window = new JFrame();
    window.setTitle("Deadlock");
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.add(new TestDeadlock());
    window.pack();
    window.setVisible(true);
}

public synchronized void updateGui(){
    SwingUtilities.invokeLater(new Runnable(){
        public void run(){
            System.out.println("Here");
            text.setText("Works");
            System.out.println("Not Here");
        }
    });
}

}

¿Fue útil?

Solución

Su método principal debe estar envuelto en invokeLater o invokeAndWait, esa es una regla de swing básica para crear Swing GUI en eventDispashthread

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {

        public void run() {
            JFrame window = new JFrame();
            window.setTitle("Deadlock");
            window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            window.add(new TestDeadlock());
            window.pack();
            window.setVisible(true);
        }
    });
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top