Тупик при использовании setText на JTextArea в Swing - PullRequest
4 голосов
/ 15 января 2012

У меня есть следующая Java-программа, которая запускается примерно в 50% всех попыток запуска.В остальное время он заходит в тупик на заднем плане без отображения графического интерфейса.Я проследил проблему до метода setText объекта JTextArea.Использование другого класса, такого как JButton, работает с setText, но JTextArea блокируется.Может кто-нибудь объяснить мне, почему это происходит и что не так со следующим кодом:

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

}

1 Ответ

7 голосов
/ 15 января 2012

ваш основной метод должен быть заключен в invokeLater или invokeAndWait, это основное правило Swing для создания Swing GUI для 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);
        }
    });
}
...