我有一个由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
周期中,但我仍然一无所获。
关于问题是什么的任何想法?我一直在努力,但我仍然无法弄清楚真正的问题是什么。
答案 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);
}