首先,我要说我对JavaFX还不熟悉。我试图编写一个程序,用户可以创建多个聊天选项卡,并通过服务器与其他用户进行通信。问题出在客户端。我在每个聊天中都有列表,其中显示了当前连接到该特定聊天的用户。当我在该列表中添加一个名称时,我得到的不是FX应用程序线程异常。
这是我的聊天课,它也是一个控制器类。只要用户想要进行新的聊天,就会加载用于聊天的FMXL文件:
public class Chat {
@FXML private ListView<String> userInChatList;
@FXML private Button chatSendTextButton;
@FXML private TextArea chatTextArea;
@FXML private TextField chatTextField;
@FXML
public String chatName;
@FXML
public ObservableList<String> users = FXCollections.observableArrayList();
@FXML
@FXML
public String yourName;
public Chat(){
}
@FXML
public void setName(String cName , String uName){
chatName = cName;
yourName = uName;
users.add(uName);
userInChatList.setItems(users);
}
@FXML
public void addUser(String uName){
users.add(uName); //WHY?
userInChatList.setItems(users);
}
@FXML
public void removeUser(String uName){
userInChatList.getItems().remove(uName);
}
@FXML
public void displayMessage(String message, String un){
if (un.equals("null")){
chatTextArea.appendText(message + "\n");
} else chatTextArea.appendText(un + "> " + message + "\n");
}
public void initialize(){
chatSendTextButton.setOnAction(event -> {
StringBuilder sb = new StringBuilder(500);
sb.append(chatName);
sb.append(":");
sb.append(yourName);
sb.append(":");
sb.append(chatTextField.getText());
String message = sb.toString();
System.out.println(message);
Client.sendText(message);
chatTextField.clear();
});
}
}
@FXML
public void addUser(String uName){
users.add(uName); //WHY?
userInChatList.setItems(users);
}
当我在“users.add”行上调用此函数时,我得到了异常。 我还尝试将用户名直接添加到列表中,如下所示:
userInChatList.getItems().addAll(un);
使用此方法可以获得相同的异常。我也希望我的删除方法也不起作用。
我认为错误是我如何将用户名添加到列表中,我已经搜索了一段时间,但我似乎找不到任何可以帮助我的东西。 提前谢谢。
我得到的完整异常消息如下:
线程“pool-2-thread-1”中的异常java.lang.IllegalStateException:不在FX应用程序线程上; currentThread = pool-2-thread-1 at com.sun.javafx.tk.Toolkit.checkFxUserThread(Toolkit.java:236) at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(QuantumToolkit.java:423) 在javafx.scene.Parent $ 2.onProposedChange(Parent.java:367) at com.sun.javafx.collections.VetoableListDecorator.setAll(VetoableListDecorator.java:113) at com.sun.javafx.collections.VetoableListDecorator.setAll(VetoableListDecorator.java:108) 在com.sun.javafx.scene.control.skin.LabeledSkinBase.updateChildren(LabeledSkinBase.java:575) at com.sun.javafx.scene.control.skin.LabeledSkinBase.handleControlPropertyChanged(LabeledSkinBase.java:204) at com.sun.javafx.scene.control.skin.ListCellSkin.handleControlPropertyChanged(ListCellSkin.java:49) at com.sun.javafx.scene.control.skin.BehaviorSkinBase.lambda $ registerChangeListener $ 61(BehaviorSkinBase.java:197) at com.sun.javafx.scene.control.MultiplePropertyChangeListenerHandler $ 1.changed(MultiplePropertyChangeListenerHandler.java:55) 在javafx.beans.value.WeakChangeListener.changed(WeakChangeListener.java:89) at com.sun.javafx.binding.ExpressionHelper $ SingleChange.fireValueChangedEvent(ExpressionHelper.java:182) at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:81) 在javafx.beans.property.StringPropertyBase.fireValueChangedEvent(StringPropertyBase.java:103) 在javafx.beans.property.StringPropertyBase.markInvalid(StringPropertyBase.java:110) 在javafx.beans.property.StringPropertyBase.set(StringPropertyBase.java:144) 在javafx.beans.property.StringPropertyBase.set(StringPropertyBase.java:49) 在javafx.beans.property.StringProperty.setValue(StringProperty.java:65) 在javafx.scene.control.Labeled.setText(Labeled.java:145) at com.sun.javafx.scene.control.skin.ListViewSkin $ 2.updateItem(ListViewSkin.java:319) 在javafx.scene.control.ListCell.updateItem(ListCell.java:471) 在javafx.scene.control.ListCell.lambda $ new $ 160(ListCell.java:167) 在javafx.collections.WeakListChangeListener.onChanged(WeakListChangeListener.java:88) at com.sun.javafx.collections.ListListenerHelper $ Generic.fireValueChangedEvent(ListListenerHelper.java:329) at com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:73) 在javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:233) 在javafx.collections.ListChangeBuilder.commit(ListChangeBuilder.java:482) 在javafx.collections.ListChangeBuilder.endChange(ListChangeBuilder.java:541) 在javafx.collections.ObservableListBase.endChange(ObservableListBase.java:205) 在javafx.collections.ModifiableObservableListBase.addAll(ModifiableObservableListBase.java:102) 在javafx.collections.ObservableListBase.addAll(ObservableListBase.java:245) at client.LoginController.addUser(LoginController.java:79) at client.Client.lambda $ processConnection $ 0(Client.java:136) 在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617) 在java.lang.Thread.run(Thread.java:745)