Combobox不会使用setCellFactory添加元素

时间:2018-06-11 16:45:54

标签: java javafx combobox

我有一个由10个Comboboxes组成的arraylist。我想用n个图像视图加载每个组合框。

我从一个给我正确数据的类中获取了我需要的数据。 您在代码中找到的arraylist的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 Image

代码工作并将我需要的图像插入到我的Comboboxes中,问题是它每次都会为每个组合框添加更多图像。

例如:第一个组合框正确加载前5个骰子。当我添加其他5个骰子(应该只添加到第二个组合框中)时,它们被添加到第一个和第二个组合框中,并且我将获得两个相同的元素组(这一直持续到结束)

我尝试在第二个周期之前更改我的代码添加options.clear(),因此重置ObservableList选项,我可以从0添加我的元素,然后将它们添加到我的h组合框中。

问题是我实际上没有插入imageView。

我也试图移动

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

在第二个for周期中,但我仍然一无所获。

关于问题是什么的任何想法?我一直在努力,但我仍然无法弄清楚真正的问题是什么。

1 个答案:

答案 0 :(得分:1)

您总是会添加到同一个列表中。对于不同的项目列表,您需要为每个.next()使用不同的ObservableList

此外,应避免重新加载图像并重新创建ComboBox以提高程序的效率:

ImageView
//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);
}