listview中的多个标签和图片javafx

时间:2018-05-29 05:53:09

标签: java sqlite javafx

我想创建包含多个标签和图像的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,我也可以使用代码。

1 个答案:

答案 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对象,因此如果多个产品使用相同的图像,这也可能是有益的。