Java 聊天程序冻结JFrame
我正在编写一个简单的聊天客户端,并将其转移到一个漂亮的GUI上。服务器端(客户端是android)的构造函数包含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
谢谢 看起来您正在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();