我正在创建一个聊天客户端,其中包含一个服务器类(主类)和一个客户端类(启动一个客户端并连接到服务器)。
然后,现在我尝试在将客户端连接到服务器之前添加带有联系人的组合框,因此我为Combobox创建了一个新类,其中包含actionListener和actionPerformed来在按下联系人时打开客户端。问题是打开的客户端正在运行(通过Server进行消息传递时看到打印输出),但是客户端GUI呈灰色且冻结(例如程序未响应时)。在我进行dispose()之前,组合框也存在同样的问题。
所以我目前对线程编码还很陌生,但是我对问题的理解(可能是错误的)是,在comboBoxClass中使用的Swing组件线程用于在comboBox中创建和单击联系人。然后,当我在comboBoxClass中创建新的Client时,我已经在其中使用了Swingthread,并且Client将无法使用“足够”的线程。不知道该怎么想,但这是我的结论。
这也是整个代码的链接:https://pastebin.com/mNeBFn7q (使用4个文本文件,因此没有它们将无法运行,但您会看到完整的结构)。
};
class comboBoxClass {
public comboBoxClass() {
String[] favContacts = {
"BigKarlos",
"lilVillz",
"metaforMatte",
"BirkoStoteles",
"Övriga Kontakter!!"
JComboBox contactList = new JComboBox(favContacts);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 100);
Container cont = frame.getContentPane();
cont.setLayout(new FlowLayout());
cont.add(contactList);
frame.setVisible(true);
contactList.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
//contactList.addActionListener(this);
ArrayList<String> arrayList = readFile();
contentArr = new String[arrayList.size()];
arrayList.toArray(contentArr);
if (contactList.getSelectedIndex() == 0) {
port = contentArr[4];
IP = contentArr[5];
}
if (contactList.getSelectedIndex() == 1) {
port = contentArr[7];
IP = contentArr[8];
}
if (contactList.getSelectedIndex() == 2) {
port = contentArr[1];
IP = contentArr[2];
}
if (contactList.getSelectedIndex() == 3) {
port = contentArr[10];
IP = contentArr[11];
}
if (contactList.getSelectedIndex() == 4) {
JFileChooser contactChooser = new JFileChooser("/Users/kasperknudsen/Documents/Chatten");
contactChooser.getFileFilter();
contactChooser.showOpenDialog(frame);
}
frame.dispose();
Client kontakt = new Client(IP,Integer.parseInt(port));
}
});
}