运行动作侦听器时,为什么我的GUI发送按钮会冻结?

时间:2018-01-10 19:07:38

标签: java button handler actionlistener

我正在制作一个带有与客户端连接的GUI的聊天服务器

GUI由两个文本框组成,一个用于接收文本,另一个用于发送文本。最后一件事就是发送按钮,我现在遇到了问题。

按下时,发送按钮冻结(GUI仍然有效,它只有冻结的按钮),并且没有发送消息。

我不知道该怎么做,希望你们可以帮助我。感谢任何帮助,谢谢!

代码:

{{1}}

1 个答案:

答案 0 :(得分:0)

Swing有一个特殊的线程负责更改GUI。事件派遣线程。 ActionListeners的方法在这个Thread上执行,这意味着如果它们花费很长时间,UI就会冻结。所以你必须在自己的线程中完成工作。不幸的是,如果您在自己的线程中并且想要更改UI,则必须在事件调度线程中执行此操作。您可以使用SwingUtilities.invokeLater执行此操作。

以下是一个例子:

import javax.swing.*;

public class Example extends JFrame {
    public static void main(String[] args) {
        Example example = new Example();
        example.setSize(200, 200);
        JButton button = new JButton("Do it");
        JTextField textField = new JTextField();
        button.addActionListener(e -> 
                new Thread(() -> {
                    doLongTask();
                    SwingUtilities.invokeLater(() -> textField.setText("Did it"));
        }).start());
        example.add(button);
        example.add(textField);
        example.pack();
        example.setVisible(true);
        example.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    private static void doLongTask() {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}