为了账号安全,请及时绑定邮箱和手机立即绑定

JavaFX ListCell updateItem 执行两次?

JavaFX ListCell updateItem 执行两次?

九州编程 2023-03-23 16:16:26
我正在尝试在 ListView 中创建自定义单元格,但每次我添加一个新项目时, updateItem (TextFlow item, Boolean empty)都会执行两次:一次它收到 null和true,第二次它没有(!空和假)如果我不实施setCellFactory方法,那么我可以毫无问题地将项目添加到表中。没有自定义 cellFactory 的ListView但是,当我实施它时,它只是创建了 10 个空单元格(内容在哪里?)。带有自定义 cellFactory 的ListViewpublic class Controller implements Initializable {@FXMLprivate 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;}}
查看完整描述

1 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

updateItem可以调用任意次数,可以传递不同的项目,单元格可以从空变为非空,反之亦然。ListView创建与您在屏幕上看到的一样多的单元格,并用项目填充它们。例如,滚动或修改列表items或调整大小ListView可以导致更新。


出于这个原因,任何单元格都需要能够处理传递null给该方法的任意项目序列(或+空)updateItem。


此外,您应该避免调用setItem自己,因为super.updateItem已经这样做了。setGraphic如果要在单元格中显示项目,请改用:


@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) {

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

                setGraphic(item);

            } else {

                setStyle(null);

                setGraphic(null);

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

            }


        }

    };

}


查看完整回答
反对 回复 2023-03-23
  • 1 回答
  • 0 关注
  • 61 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信