gpt4 book ai didi

java - 组合框不使用 setCellFactory 添加元素

转载 作者:行者123 更新时间:2023-12-02 11:07:53 25 4
gpt4 key购买 nike

我有一个由 10 个组合框组成的数组列表。我想用 n 个 ImageView 加载每个组合框。

我从一个类中获取了我需要的数据,该类为我提供了正确的数据。您在代码中找到的 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

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

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

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

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

我也尝试过移动

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

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

有什么问题的想法吗?我已经尝试了很长时间,但我仍然无法弄清楚真正的问题是什么。

最佳答案

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

此外,应避免重新加载图像和重新创建 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);
}
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");
}
}

}

关于java - 组合框不使用 setCellFactory 添加元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50802530/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com