在运行期间向ListView添加元素时不要使用FX应用程序线程

时间:2015-11-06 13:38:05

标签: listview javafx

首先,我要说我对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)

0 个答案:

没有答案