Java 在Swing中的JTextArea上使用setText时出现死锁

Java 在Swing中的JTextArea上使用setText时出现死锁,java,swing,deadlock,event-dispatch-thread,concurrency,Java,Swing,Deadlock,Event Dispatch Thread,Concurrency,我有下面的Java程序,其中一个在大约50%的启动尝试中启动。其余时间,它将在后台死锁,而不显示任何GUI。我将问题追溯到JTextArea对象的setText方法。使用像JButton这样的另一个类可以处理setText,但是JTextArea死锁。有谁能向我解释一下为什么会发生这种情况,以及以下代码有什么问题: public class TestDeadlock extends JPanel { private JTextArea text; TestDeadlock(){ text

我有下面的Java程序,其中一个在大约50%的启动尝试中启动。其余时间,它将在后台死锁,而不显示任何GUI。我将问题追溯到JTextArea对象的setText方法。使用像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");
        }
    });
}

}

您的主方法必须包装到
invokeLater
invokeAndWait
中,这是要创建的基本Swing规则


尽量不要使用
invokeLater
。这种行为可能是由于缺少调度线程,因为您尚未创建任何窗口。一个是在你展示它的时候创建的。谢谢你的评论,现在这个行为对我来说是有意义的。谢谢你的帮助,因为我是swing新手,我不知道这个规则。
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);
        }
    });
}