2012-12-12 3 views
2

JavaFX를 사용하여 범용 채팅 응용 프로그램을 만들고 있습니다. 나는 SceneBuilder를 사용하여 목록보기를 생성하고 아래와 같이 ObservableList와 함께 모델 :observablelist javaFX의 업데이트 문제

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() 메서드가 호출 될 때, 예외가 발생 : initList() 방법이 제대로 작동

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) 

동안 . 왜?

+0

대답을 수락 한 것으로 표시하십시오. –

답변

3

UI는 GUI 스레드로만 업데이트 할 수 있습니다.

사용 :

초기화() 메소드는 이미 FX 응용 프로그램 스레드에서 호출되기 때문에 아마 작동 왜
// create JavaFX scene 
Platform.runLater(new Runnable() { 
    public void run() { 
     members.add(name); 
    } 
}); 

javadoc의 link에서

:

public static void runLater(java.lang.Runnable runnable) 

실행 JavaFX 응용 프로그램 스레드에서 지정된 Runnable을 에 지정하지 않았습니다. 미래. 이 메서드는 임의의 thread 에서 호출 할 수 있습니다.이 메서드는 이벤트 큐에 Runnable를 게시 한 다음 을 호출자에게 즉시 반환합니다. Runnables는 순서로 실행됩니다. runLater 메소드에 건네진 실행 가능 파일은, runLater가 후속의 호출 runLater에 건네주기 전에 실행 해, 가 실행됩니다.

+0

감사합니다. aksel !!!!! 그게 정말 도움이 !! 기쁜 마음으로 – ashishcloud

+0

:) –