JavaFX ListCell updateItem 执行两次?

我正在尝试在 ListView 中创建自定义单元格,但每次我添加一个新项目时, updateItem (TextFlow item, Boolean empty)都会执行两次:一次它收到 nulltrue,第二次它没有(!空

如果我不实施setCellFactory方法,那么我可以毫无问题地将项目添加到表中。

没有自定义 cellFactory 的ListView

但是,当我实施它时,它只是创建了 10 个空单元格(内容在哪里?)。

带有自定义 cellFactory 的ListView

public class Controller implements Initializable {


@FXML

private ListView <TextFlow> console;


private ObservableList<TextFlow> data = FXCollections.observableArrayList();


public void initialize(URL location, ResourceBundle resources) {


    console.setCellFactory(new Callback<ListView<TextFlow>, ListCell<TextFlow>>() {


        @Override

        public ListCell<TextFlow> call(ListView<TextFlow> param) {

            return new ListCell<TextFlow>() {

                @Override

                protected void updateItem(TextFlow item, boolean empty) {

                    super.updateItem(item, empty);


                    if (item != null) {

                        setItem(item);

                        setStyle("-fx-control-inner-background: blue;");

                    } else {

                        System.out.println("Item is null.");

                    }


                }

            };

        }


    });



    for (int i = 0 ; i < 10; i++) {

        Text txt = getStyledText("This is item number " + i + ".");

        TextFlow textFlow = new TextFlow();

        textFlow.getChildren().add(txt);

        data.add(textFlow);

    }


    console.setItems(data);


}


private Text getStyledText (String inputText) {

    Text text = new Text(inputText);

    text.setFont(new Font("Courier New",12));

    text.setFill(Paint.valueOf("#000000"));

    return text;

}

}


九州编程
浏览 85回答 1
1回答

白板的微信

updateItem可以调用任意次数,可以传递不同的项目,单元格可以从空变为非空,反之亦然。ListView创建与您在屏幕上看到的一样多的单元格,并用项目填充它们。例如,滚动或修改列表items或调整大小ListView可以导致更新。出于这个原因,任何单元格都需要能够处理传递null给该方法的任意项目序列(或+空)updateItem。此外,您应该避免调用setItem自己,因为super.updateItem已经这样做了。setGraphic如果要在单元格中显示项目,请改用:@Overridepublic ListCell<TextFlow> call(ListView<TextFlow> param) {&nbsp; &nbsp; return new ListCell<TextFlow>() {&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; protected void updateItem(TextFlow item, boolean empty) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; super.updateItem(item, empty);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (item != null) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setStyle("-fx-control-inner-background: blue;");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setGraphic(item);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setStyle(null);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setGraphic(null);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("Item is null.");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; };}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java