Несколько меток и изображений в виде списка javafx - PullRequest
0 голосов
/ 29 мая 2018

Я хочу создать элемент 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 () получает только одну строку.Что касается изображения, я хочу установить разные изображения для каждого элемента отдельно.Я пытался отправить в конструктор, но тогда все изображения одинаковы.Я использую MVC, и я также могу работать с кодом.

1 Ответ

0 голосов
/ 29 мая 2018

Похоже, что ваши элементы списка - это больше, чем просто строки, и поэтому ваша модель должна быть более специализированным классом.В зависимости от того, насколько это сложно, вы можете даже захотеть использовать 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 для метода 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, поэтому, если несколько продуктов используют одно и то же изображение, это также может быть полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...