我想创建包含多个标签和图像的listView项目。我创建了一个单元类:
public class Cell extends ListCell<String> {
private HBox hBox;
private Label description;
private Pane pane;
private ImageView imageView;
private Image deleteImage;
private JFXButton delete;
public Cell() {
super();
this.hBox = new HBox();
this.description = new Label();
this.pane = new Pane();
this.delete = new JFXButton("delete");
this.hBox.getChildren().addAll(description, pane, delete);
HBox.setHgrow(pane, Priority.ALWAYS);
delete.setOnAction(event -> getListView().getItems().remove(getItem()));
}
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
setText(null);
setGraphic(null);
if (item != null && !empty) {
description.setText(item);
setGraphic(hBox);
}
}
这是我的控制器代码的一部分:
void addToShopCart(ActionEvent event) {
Image partImage = selectedPart.getPicture();
shopListView.getItems().addAll(selectedPart.getDescription());
shopListView.setCellFactory(param -> new Cell(partImage));
}
selectedpart我的自定义类,它有一个图像。 但是现在我不知道如何将文本发送到这些标签,因为updateItem()方法只获得一个String。关于图像,我想分别为每个项目设置不同的图像。我试图发送给构造函数,但随后所有图像都是相同的。我正在使用MVC,我也可以使用代码。
答案 0 :(得分:1)
听起来你的列表项不仅仅是字符串,所以你的模型应该是一个更专业的类。根据它的复杂程度,您甚至可能想要使用TableView
,但现在假设您只有一个名称和一个图像,并希望使用ListView
。
首先,您需要一个描述列表中项目的类 - 可能是“产品”(因为它是购物清单)并且有描述和图像:
class Product {
final StringProperty description = new SimpleStringProperty(this, "description");
final StringProperty image = new SimpleStringProperty(this, "image");
// add getters, property-getters and setters...
}
接下来,将您的Cell
类定义为扩展ListCell<Product>
- 这意味着item
属性的类型为Product
,应该是item
的类型1}} updateItem
方法的参数
现在,无论何时更新/更改项目,您都可以更改描述和图像:
@Override
protected void updateItem(Product item, boolean empty) {
super.updateItem(item, empty);
setText(null);
setGraphic(null);
if (item != null && !empty) {
description.setText(item.getDescription());
imageView.setImage(...);
setGraphic(hBox);
}
}
添加项目时,使用适当的描述和图像创建新的Product
实例,并将其添加到列表中。
请注意,每次添加项目时都不需要调用setCellFactory
- 在初始化期间应该调用一次(假设可能有理由在设置后更改单元工厂,但这不是常见的练习,在你的情况下不需要)。
注意:加载图像可能很慢(取决于图像大小),因此您可能希望缓存或预加载实际的Image
个对象。您还可以在多个Image
实例中使用相同的ImageView
对象,因此如果多个产品使用相同的图像,这也可能是有益的。