Combobox не добавляет элемент с помощью setCellFactory - PullRequest
0 голосов
/ 11 июня 2018

У меня есть arraylist, сделанный из 10 Comboboxes.Я хотел бы загрузить каждый комбинированный список с n просмотрами изображений.

Я получаю нужные мне данные из класса, который дает мне правильные данные.Массив arraylist, который вы найдете в коде, представляет собой «симуляцию» различных кубиков друг над другом, создавая разные столбцы.Например, у меня есть максимум 10 столбцов, каждый из которых состоит из n кубиков.

Вот код:

        //LOADING DICES INTO MY COMBOBOXES
    //List used to load strings  
    ObservableList<String> options = FXCollections.observableArrayList();
    //Arraylist made of arraylist containing the data I need
    ArrayList<ArrayList<Dice>> roundTrackData = gameManager.roundTrack.getDices();
    System.out.println(roundTrackData);
    for(int h=0; h<roundTrackData.size();h++){
        System.out.println(" h Value:" + h);
        ArrayList<Dice> testing = roundTrackData.get(h);
         System.out.println(" Testing:" + testing);
         System.out.println(" Testing size:" + testing.size());


        for(int u=0; u<testing.size();u++){
             System.out.println(" Inside cicle ");

             String color = Character.toString(testing.get(u).getColor());
             String value = testing.get(u).getValue().toString();
             String diceRound = value+color+".png";

             options.add(diceRound);
             //listaComboBox is an array list containing 10 comboboxes
             listaComboBox.get(h).setItems(options);
             listaComboBox.get(h).setCellFactory(c -> new StatusListCell());
             System.out.println("Dice color "+ color);
             System.out.println("Dice value"+ value);
       }
   }

Класс StatusListCell:

public class StatusListCell extends ListCell<String> {
protected void updateItem(String item, boolean empty) {
    super.updateItem(item, empty);
    System.out.println("IT'S NULL");

    setGraphic(null);
    setText(null);
    if (item != null) {
        System.out.println("IT'S NOT NULL!");

        ImageView imageView = new ImageView(new Image(item));
        imageView.setFitWidth(40);
        imageView.setFitHeight(40);
        setGraphic(imageView);
        setText("a");
    }
  }
}

Я разработал свой кодпосле этого вопроса: Изображение JavaFX ComboBox

Код работает и вставляет нужные мне изображения в мои списки, проблема в том, что он добавляет каждый раз больше изображений в каждый список.

Например : первый комбинированный список правильно загружает первые 5 кубиков.Когда я добавляю другие 5 кубиков (которые должны быть добавлены только во второй комбинированный список), они добавляются как к первому, так и ко второму комбинированным спискам, и я получаю две идентичные группы элементов (это продолжается до конца).

Я пытался изменить свой код, добавив options.clear() перед вторым циклом, поэтому параметры ObservableList сбрасываются, и я могу добавить свои элементы с 0, а затем добавить их в свой h комбинированный список.

Проблема в том, что я фактически не вставляю imageView.

Я также пытался вывести

listaComboBox.get(h).setItems(options);
listaComboBox.get(h).setCellFactory(c -> new StatusListCell());

из второго for цикла, но я все еще ничего не получаю.

Есть идеи, в чем проблема?Я так долго пытался, но до сих пор не могу понять, в чем реальная проблема.

1 Ответ

0 голосов
/ 11 июня 2018

Вы всегда добавляете в один и тот же список.Для разных списков предметов вы должны использовать разные ObservableList для каждого ComboBox.

Кроме того, следует избегать перезагрузки изображений и воссоздания ImageView s для повышения эффективности вашей программы:

//Arraylist made of arraylist containing the data I need
ArrayList<ArrayList<Dice>> roundTrackData = gameManager.roundTrack.getDices();
System.out.println(roundTrackData);
final Map<String, WeakReference<Image>> cache = new HashMap<>();

for(int h = 0; h < roundTrackData.size(); h++) {
    ComboBox<String> combo = listaComboBox.get(h);
    combo.setCellFactory(c -> new StatusListCell(cache));
    ObservableList<String> options = FXCollections.observableArrayList();

    List<Dice> testing = roundTrackData.get(h);
    System.out.println(" Testing:" + testing);
    System.out.println(" Testing size:" + testing.size());

    for(Dice die : testing){
         System.out.println(" Inside cicle ");
         String color = Character.toString(die.getColor());
         String value = die.getValue().toString();
         String diceRound = value+color+".png";

         options.add(diceRound);
         //listaComboBox is an array list containing 10 comboboxes
         System.out.println("Dice color "+ color);
         System.out.println("Dice value"+ value);
    }

    combo.setItems(options);
}
public class StatusListCell extends ListCell<String> {

    private final Map<String, WeakReference<Image>> cache;
    private final ImageView imageView;

    public StatusListCell(Map<String, WeakReference<Image>> cache) {
        imageView = new ImageView();
        imageView.setFitWidth(40);
        imageView.setFitHeight(40);
        setGraphic(imageView); // keep image even if empty for constant cell size
        this.cache = cache;
    }

    protected void updateItem(String item, boolean empty) {
        super.updateItem(item, empty);

        if (empty || item == null) {
            setText("");
            imageView.setImage(null); // don't display a image
        } else {
            cache.compute(item, (k, v) -> {
                // retrieve image or load
                Image img = null;
                if (v != null) {
                    img = v.get();
                }
                if (img == null) {
                    img = new Image(k);
                    v = new WeakReference<>(img);
                }

                // change image in imageview
                imageView.setImage(img);

                return v;
            });
            setText("a");
        }
    }

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