可观察列表的奇怪行为

时间:2015-04-14 21:09:27

标签: listview javafx event-handling event-dispatch-thread observablelist

我使用Listview绑定了一个observablelist来在listview上执行我的任务。 listview和observablelist的类型是我在模型层中定义的模型。所以我使用单元工厂从我的模型对象渲染图形节点。我应该在用户在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>

谢谢你的进步

0 个答案:

没有答案