javaFX中的observablelist更新问题
我正在使用JavaFX创建一个通用聊天应用程序。我使用SceneBuilder创建了一个listView,并使用javaFX中的observablelist更新问题,java,listview,javafx,Java,Listview,Javafx,我正在使用JavaFX创建一个通用聊天应用程序。我使用SceneBuilder创建了一个listView,并使用ObservableList对其进行建模,如下所示: public static ObservableList<String> members = FXCollections.observableArrayList(); @FXML public static Button send; @FXML static ListView names; @FXML static
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());
}
而
initList()
方法工作正常。为什么?用户界面只能由gui线程更新
使用:
initialize()方法之所以有效,可能是因为它已从FX应用程序线程调用
从javadoc:
在某个时间在JavaFX应用程序线程上运行指定的Runnable
未指定未来的时间。此方法,可从调用
任何线程都会将Runnable发布到事件队列,然后返回
立即给打电话的人打电话。可运行项按顺序执行
它们被贴上了。传入runLater方法的runnable将
在任何Runnable传递到对的后续调用之前执行
晚点
请将答案标记为已接受
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)
// create JavaFX scene
Platform.runLater(new Runnable() {
public void run() {
members.add(name);
}
});
public static void runLater(java.lang.Runnable runnable)