JavaFX:单击时组合框单元格消失
JavaFX: ComboBox cells disappear when clicked
我正在使用 javafx 多输入 types.but java 项目] 我有一个扼杀 ComboBox 行为,因为我在上面使用 Labels 和图像(ImageView) .
1- Combobox 看起来是 white!但我需要黑色的。
2- 每次 我选择一个项目。
3- 它消失了!!!
这是我的代码:
...
import javafx.scene.control.ComboBox;
import javafx.scene.image.ImageView;
ImageView img_tun = new ImageView("images/icones/flag/Tunisia.png");
Label lbl_tun=new Label("1",img_tun);
ImageView img_fr = new ImageView("images/icones/flag/France.png");
Label lbl_fr=new Label("2",img_fr);
ImageView img_aut = new ImageView("images/icones/flag/World.png");
Label lbl_aut=new Label("3",img_aut);
optionsnat=FXCollections.observableArrayList(lbl_tun,lbl_fr,lbl_aut);
@FXML
ComboBox<Label> cb_nat = new ComboBox<Label>();
private String nat="1";
...
@Override
public void initialize(URL location, ResourceBundle resources) {
...
cb_nat.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observableValue, Number number, Number number2) {
if(cb_nb.getItems().get((Integer) number2)=="1"){setNat("1");}
else if(cb_nb.getItems().get((Integer) number2)=="2"){setNat("2");}
else if(cb_nb.getItems().get((Integer) number2)=="3"){setNat("3");}
else{System.err.println("Erreur lors de changement de nation..");}
}
});
}
...
和code.fxml
<ComboBox fx:id="cb_nat" layoutX="40.0" layoutY="265.0" prefWidth="150.0" />
编辑:
读完这篇Article我知道我的方法完全错误,强烈不推荐..如果有人有其他想法将 bnation 标志放在 ComboBox 中,请帮助!!
谢谢..(抱歉我的英语不好)
导致这个问题的原因是,当您选择一个 ListCell 时,它的项目(在我们的情况下是标签)被 ComboBox 从 ListCell(Items observableList)移动到 ButtonCell,ButtonCell 是那个小盒子默认为空。但是,我们都知道任何 Node 对象都不能在同一场景中的任何位置放置两次,并且由于 ListCell class 没有克隆函数,javafx 将其从最后一个位置移除到新位置 ButtonCell .
解决方法是添加字符串
列表中的项目并提供一个单元工厂以在单元工厂内创建标签节点。创建一个名为“StringImageCell”的 class 并执行以下操作:
- 您需要设置 cellFactory 属性:
cb_nat.setCellFactory(listview -> new StringImageCell());
- 您需要设置 buttonCell 属性:
cb_nat.setButtonCell(new StringImageCell());
这是一个例子:
public class ComboBoxCellFactory extends Application {
@Override
public void start(Stage stage) throws Exception {
ComboBox<String> comboBox = new ComboBox<>();
comboBox.getItems().addAll("1", "2", "3");
//Set the cellFactory property
comboBox.setCellFactory(listview -> new StringImageCell());
// Set the buttonCell property
comboBox.setButtonCell(new StringImageCell());
BorderPane root = new BorderPane();
root.setCenter(comboBox);
Scene scene = new Scene(root, 600, 600);
stage.setScene(scene);
stage.show();
}
//A Custom ListCell that displays an image and string
static class StringImageCell extends ListCell<String> {
Label label;
static HashMap<String, Image> pictures = new HashMap<>();
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (item == null || empty) {
setItem(null);
setGraphic(null);
} else {
setText(item);
ImageView image = getImageView(item);
label = new Label("",image);
setGraphic(label);
}
}
}
private static ImageView getImageView(String imageName) {
ImageView imageView = null;
switch (imageName) {
case "1":
case "2":
case "3":
if (!pictures.containsKey(imageName)) {
pictures.put(imageName, new Image(imageName + ".png"));
}
imageView = new ImageView(pictures.get(imageName));
break;
default:
imageName = null;
}
return imageView;
}
public static void main(String[] args) {
launch(args);
}
}
我正在使用 javafx 多输入 types.but java 项目] 我有一个扼杀 ComboBox 行为,因为我在上面使用 Labels 和图像(ImageView) .
1- Combobox 看起来是 white!但我需要黑色的。
2- 每次 我选择一个项目。
3- 它消失了!!!
这是我的代码:
...
import javafx.scene.control.ComboBox;
import javafx.scene.image.ImageView;
ImageView img_tun = new ImageView("images/icones/flag/Tunisia.png");
Label lbl_tun=new Label("1",img_tun);
ImageView img_fr = new ImageView("images/icones/flag/France.png");
Label lbl_fr=new Label("2",img_fr);
ImageView img_aut = new ImageView("images/icones/flag/World.png");
Label lbl_aut=new Label("3",img_aut);
optionsnat=FXCollections.observableArrayList(lbl_tun,lbl_fr,lbl_aut);
@FXML
ComboBox<Label> cb_nat = new ComboBox<Label>();
private String nat="1";
...
@Override
public void initialize(URL location, ResourceBundle resources) {
...
cb_nat.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observableValue, Number number, Number number2) {
if(cb_nb.getItems().get((Integer) number2)=="1"){setNat("1");}
else if(cb_nb.getItems().get((Integer) number2)=="2"){setNat("2");}
else if(cb_nb.getItems().get((Integer) number2)=="3"){setNat("3");}
else{System.err.println("Erreur lors de changement de nation..");}
}
});
}
...
和code.fxml
<ComboBox fx:id="cb_nat" layoutX="40.0" layoutY="265.0" prefWidth="150.0" />
编辑:
读完这篇Article我知道我的方法完全错误,强烈不推荐..如果有人有其他想法将 bnation 标志放在 ComboBox 中,请帮助!!
谢谢..(抱歉我的英语不好)
导致这个问题的原因是,当您选择一个 ListCell 时,它的项目(在我们的情况下是标签)被 ComboBox 从 ListCell(Items observableList)移动到 ButtonCell,ButtonCell 是那个小盒子默认为空。但是,我们都知道任何 Node 对象都不能在同一场景中的任何位置放置两次,并且由于 ListCell class 没有克隆函数,javafx 将其从最后一个位置移除到新位置 ButtonCell .
解决方法是添加字符串 列表中的项目并提供一个单元工厂以在单元工厂内创建标签节点。创建一个名为“StringImageCell”的 class 并执行以下操作:
- 您需要设置 cellFactory 属性:
cb_nat.setCellFactory(listview -> new StringImageCell());
- 您需要设置 buttonCell 属性:
cb_nat.setButtonCell(new StringImageCell());
这是一个例子:
public class ComboBoxCellFactory extends Application {
@Override
public void start(Stage stage) throws Exception {
ComboBox<String> comboBox = new ComboBox<>();
comboBox.getItems().addAll("1", "2", "3");
//Set the cellFactory property
comboBox.setCellFactory(listview -> new StringImageCell());
// Set the buttonCell property
comboBox.setButtonCell(new StringImageCell());
BorderPane root = new BorderPane();
root.setCenter(comboBox);
Scene scene = new Scene(root, 600, 600);
stage.setScene(scene);
stage.show();
}
//A Custom ListCell that displays an image and string
static class StringImageCell extends ListCell<String> {
Label label;
static HashMap<String, Image> pictures = new HashMap<>();
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (item == null || empty) {
setItem(null);
setGraphic(null);
} else {
setText(item);
ImageView image = getImageView(item);
label = new Label("",image);
setGraphic(label);
}
}
}
private static ImageView getImageView(String imageName) {
ImageView imageView = null;
switch (imageName) {
case "1":
case "2":
case "3":
if (!pictures.containsKey(imageName)) {
pictures.put(imageName, new Image(imageName + ".png"));
}
imageView = new ImageView(pictures.get(imageName));
break;
default:
imageName = null;
}
return imageView;
}
public static void main(String[] args) {
launch(args);
}
}