gpt4 book ai didi

JavaFX ListCell updateItem 执行两次?

转载 作者:行者123 更新时间:2023-12-02 01:25:26 26 4
gpt4 key购买 nike

我试图在 ListView 中创建自定义单元格,但每次添加新项目时,updateItem(TextFlow item, Boolean empty) 都会执行两次:一次接收 nulltrue,第二次则不然(!nullfalse)

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

ListView without custom cellFactory

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

ListView with custom cellFactory

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;
}
}

最佳答案

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

因此,任何单元格都需要能够处理传递给 updateItem 方法的任意项目序列(或 null+empty)。

此外,您应该避免自己调用 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.");
}

}
};
}

关于JavaFX ListCell updateItem 执行两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57019434/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com