Java 聊天程序冻结JFrame

Java 聊天程序冻结JFrame,java,swing,awt,jlist,event-dispatch-thread,Java,Swing,Awt,Jlist,Event Dispatch Thread,我正在编写一个简单的聊天客户端,并将其转移到一个漂亮的GUI上。服务器端(客户端是android)的构造函数包含JFrame中的一个列表,服务器的第一部分运行,但是整个框架都被锁定。有人看到这个问题吗?抱歉,代码相对混乱,注释不干净。。。 服务器: 图形用户界面: 谢谢 看起来您正在Swing线程上启动服务器(请参阅:)。只要调用cServer.run()在ActionListener中,您正在阻止EDT执行任何其他操作(例如更新JFrame和响应事件)。改为在后台线程中启动服务器: new T

我正在编写一个简单的聊天客户端,并将其转移到一个漂亮的GUI上。服务器端(客户端是android)的构造函数包含JFrame中的一个列表,服务器的第一部分运行,但是整个框架都被锁定。有人看到这个问题吗?抱歉,代码相对混乱,注释不干净。。。 服务器:

图形用户界面:


谢谢

看起来您正在Swing线程上启动服务器(请参阅:)。只要调用
cServer.run()
ActionListener
中,您正在阻止EDT执行任何其他操作(例如更新
JFrame
和响应事件)。改为在后台线程中启动服务器:

new Thread(new Runnable()
{
  @Override
  public void run()
  {
    // start your server
  }
}).start();

我把同步化的东西放进去做个猜测,我来试试看!“我怎样才能阻止像这样运行的线程呢?”bensherms看到了吗
    import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JMenu;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.List;
import java.awt.Toolkit;


@SuppressWarnings("serial")
public class ClientGUI extends JFrame {

    private JPanel contentPane;
    private JTextField txtEnterTextHere;
    private JMenuBar menuBar;
    private List messageList;
    private JMenu mnOptions;
    private JMenu mnHelp;
    private JMenuItem mntmStartServer;
    private JMenuItem mntmStopServer;
    private JMenuItem mntmConnectionInfo;
    private JMenuItem mntmEmailDeveloper;
    private static String userName;
    private ChatServer cServer;


    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    ClientGUI frame = new ClientGUI();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public ClientGUI() {
        setTitle("Ben's Chat Client");
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);

        menuBar = new JMenuBar();
        setJMenuBar(menuBar);

        JMenu mnFile = new JMenu("File");
        menuBar.add(mnFile);

        JMenuItem mntmExit = new JMenuItem("Exit");
        mntmExit.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                JOptionPane.showConfirmDialog(null, "Are you sure you want to exit?");
            }



        });
        mnFile.add(mntmExit);

        mnOptions = new JMenu("Options");
        menuBar.add(mnOptions);

        mntmStartServer = new JMenuItem("Start Server");
        mntmStartServer.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                ChatServer cServer = new ChatServer(messageList);   
                cServer.run();
            }
        });
        mnOptions.add(mntmStartServer);

        mntmStopServer = new JMenuItem("Stop Server");
        mnOptions.add(mntmStopServer);

        mntmConnectionInfo = new JMenuItem("Connection Info");
        mnOptions.add(mntmConnectionInfo);

        mnHelp = new JMenu("Help");
        menuBar.add(mnHelp);

        mntmEmailDeveloper = new JMenuItem("Email Developer");
        mnHelp.add(mntmEmailDeveloper);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        txtEnterTextHere = new JTextField();
        txtEnterTextHere.setBounds(10, 220, 334, 20);
        txtEnterTextHere.setText("Enter text here...");
        contentPane.add(txtEnterTextHere);
        txtEnterTextHere.setColumns(10);

        JButton btnSend = new JButton("Send");
        btnSend.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                messageList.add(userName + ": " + txtEnterTextHere.getText().toString());
            }
        });

        messageList = new List();   
        btnSend.setBounds(349, 219, 85, 23);
        contentPane.add(btnSend);
        messageList.setBounds(10, 10, 424, 204);
        contentPane.add(messageList);

    }

    public static String getUsername()
    {
        return userName;
    }

    public static void setUsername(String entName)
    {
        userName = entName;
    }
}
new Thread(new Runnable()
{
  @Override
  public void run()
  {
    // start your server
  }
}).start();