リストビューでタスクを実行するために、オブザーバブルリストをリストビューにバインドしました。リストビューとオブザーバブルリストのタイプは、モデルレイヤーで定義したモデルです。したがって、セルファクトリを使用して、モデルオブジェクトからグラフィカルノードをレンダリングします。ユーザーが textField にテキストを入力すると、observablelist にアイテムを追加する必要があります。私の問題は、ユーザーが新しいテキストを入力し、アイテムをobservablelistに追加すると、リストビューに追加の予期しないアイテムが表示されることです。しかし、イベントハンドラーから監視可能なリストにいくつかの項目を手動で追加すると、リストビューは正しく機能します。スレッドの問題が原因だと思いますが、解決できません。
ここに私の問題を引き起こす簡単な例があります:
FXMLDocumentController.java:
public class FXMLDocumentController implements Initializable {
@FXML
ListView<String> list;
ObservableList<String> ol;
@FXML
TextField text;
@Override
public void initialize(URL url, ResourceBundle rb) {
ol = FXCollections.observableArrayList();
list.setItems(ol);
list.setCellFactory((ListView<String> param) -> {
ListCell<String> lc = new ListCell<String>(){
@Override
protected void updateItem(String item, boolean empty){
super.updateItem(item, empty);
if(!empty){
System.out.println("HI");
Parent root = null;
try {
root = FXMLLoader.load(getClass().getResource("Entry.fxml"));
} catch (IOException ex) {
}
((Label)(root.lookup("#label"))).setText(item);
setGraphic(root);
}
}
};
return lc;
});
text.setOnAction((ActionEvent event) -> {
ol.add(text.getText());
text.clear();
});
}
}
FXMLDoument.fxml:
<AnchorPane id="AnchorPane" prefHeight="511.0" prefWidth="420.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="testapp.FXMLDocumentController">
<children>
<ListView fx:id="list" layoutX="68.0" layoutY="14.0" prefHeight="391.0" prefWidth="284.0" />
<TextField fx:id="text" layoutX="110.0" layoutY="419.0" />
</children>
</AnchorPane>
Entry.fxml:
<AnchorPane id="AnchorPane" prefHeight="50.0" prefWidth="250.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
<children>
<Label fx:id="label" layoutX="70.0" layoutY="18.0" prefHeight="15.0" prefWidth="178.0" AnchorPane.rightAnchor="49.0" />
</children>
</AnchorPane>
よろしくお願いします