gpt4 book ai didi

java - javaFX中的observablelist更新问题

转载 作者:行者123 更新时间:2023-12-04 05:19:25 25 4
gpt4 key购买 nike

我正在使用 JavaFX 创建一个通用聊天应用程序。我使用 SceneBuilder 创建了一个 listView 并使用 ObservableList 对其进行了建模。像下面这样:

public static ObservableList<String>  members = FXCollections.observableArrayList();

@FXML public static Button send;
@FXML static ListView names;
@FXML static HTMLEditor outmsg;
@FXML static HTMLEditor showBox;

static void updateRemove(String newuser) {

// showBox.setHtmlText(showBox.getHtmlText()+newuser+"<br> has left room");
System.out.println(newuser+"has left room");
members.remove(newuser);
System.out.println("helloji update remove");


}
@FXML public void sendAction(ActionEvent event)
{


LoginController.instance.c.sendMessage(outmsg.getHtmlText());


}
public static void updateList(String name)
{
// showBox.setHtmlText(showBox.getHtmlText()+"<br> new user entered in room");
System.out.println("new user enterd"+name);
System.out.println("beginning update list");
members.add(name);
System.out.println(members);
System.out.println("add user request fullfilled");


}
public static void initList(Vector<String> name)
{
System.out.println("list initializing");
members.setAll(name);
System.out.println(members);
System.out.println("list initialized");

System.out.println("public room created");


}
public static void showMessage(String msg)
{

// showBox.setHtmlText(showBox.getHtmlText()+""+msg);
System.out.println("showing msg "+msg);
}

@Override
public void initialize(URL url, ResourceBundle rb) {
// TODO



names.setItems(members);
// showBox.setHtmlText(showBox.getHtmlText()+"<br> welcome "+Client.username);
System.out.println("welcome "+Client.username);

System.out.println(names.getItems());

}

}

但是当它的 updateRemove()方法被调用,异常被抛出:
java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-4
at com.sun.javafx.tk.Toolkit.checkFxUserThread(Unknown Source)
at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(Unknown Source)
at javafx.scene.Parent$1.onProposedChange(Unknown Source)
at com.sun.javafx.collections.VetoableObservableList.setAll(Unknown Source)
at com.sun.javafx.collections.ObservableListWrapper.setAll(Unknown Source)
at com.sun.javafx.scene.control.skin.LabeledSkinBase.updateChildren(Unknown Source)
at com.sun.javafx.scene.control.skin.LabeledSkinBase.handleControlPropertyChanged(Unknown Source)
at com.sun.javafx.scene.control.skin.SkinBase$4.changed(Unknown Source)
at javafx.beans.value.WeakChangeListener.changed(Unknown Source)
at com.sun.javafx.binding.ExpressionHelper$SingleChange.fireValueChangedEvent(Unknown Source)
at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(Unknown Source)
at javafx.beans.property.StringPropertyBase.fireValueChangedEvent(Unknown Source)
at javafx.beans.property.StringPropertyBase.markInvalid(Unknown Source)
at javafx.beans.property.StringPropertyBase.set(Unknown Source)
at javafx.beans.property.StringPropertyBase.set(Unknown Source)
at javafx.beans.property.StringProperty.setValue(Unknown Source)
at javafx.scene.control.Labeled.setText(Unknown Source)
at com.sun.javafx.scene.control.skin.ListViewSkin$12.updateItem(Unknown Source)
at javafx.scene.control.ListCell.updateItem(Unknown Source)
at javafx.scene.control.ListCell.access$000(Unknown Source)
at javafx.scene.control.ListCell$5.onChanged(Unknown Source)
at com.sun.javafx.scene.control.WeakListChangeListener.onChanged(Unknown Source)
at com.sun.javafx.collections.ObservableListWrapper.callObservers(Unknown Source)
at com.sun.javafx.collections.ObservableListWrapper.remove(Unknown Source)
at com.sun.javafx.collections.ObservableListWrapper.remove(Unknown Source)
at truechatter.RoomController.updateRemove(RoomController.java:45)
at truechatter.Client.run(Client.java:78)

initList()方法工作正常。为什么?

最佳答案

UI 只能由 gui 线程更新。

使用:

// create JavaFX scene
Platform.runLater(new Runnable() {
public void run() {
members.add(name);
}
});

为什么 initialize() 方法有效可能是因为它已经从 FX 应用程序线程调用

来自 javadoc link :
public static void runLater(java.lang.Runnable runnable)

Run the specified Runnable on the JavaFX Application Thread at some unspecified time in the future. This method, which may be called from any thread, will post the Runnable to an event queue and then return immediately to the caller. The Runnables are executed in the order they are posted. A runnable passed into the runLater method will be executed before any Runnable passed into a subsequent call to runLater.

关于java - javaFX中的observablelist更新问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13833968/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com