JavaFX:ComboBox单元格在单击时消失
我正在使用javafx多种输入类型进行java项目。但是,由于我使用带有图像(ImageView)的Label,因此我有一种扼杀组合框的行为 1-组合框显示为白色!但我需要黑色的 2-每次我选择一个项目 3-它消失了强> 这是我的密码:JavaFX:ComboBox单元格在单击时消失,java,javafx,combobox,imageview,scenebuilder,Java,Javafx,Combobox,Imageview,Scenebuilder,我正在使用javafx多种输入类型进行java项目。但是,由于我使用带有图像(ImageView)的Label,因此我有一种扼杀组合框的行为 1-组合框显示为白色!但我需要黑色的 2-每次我选择一个项目 3-它消失了 这是我的密码: ... import javafx.scene.control.ComboBox; import javafx.scene.image.ImageView; ImageView img_tun = new ImageView("images/ic
...
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..");}
}
});
}
...
编辑: 读了这篇文章后,我知道我的方法完全错误,强烈不推荐使用。。如果有人有其他想法把国家国旗在组合框请帮助
谢谢……(抱歉我的英语不好)导致此问题的原因是,当您选择一个ListCell时,它的项(在我们的情况下是标签)被ComboBox从ListCell(Items observableList)移动到ButtonCell,ButtonCell是默认为空的小框。但是,我们都知道,任何节点对象都不能在同一场景中的任何位置放置两次,并且由于ListCell类没有克隆函数,javafx将其从最后一个位置移到新位置ButtonCell 解决方案是添加字符串 列表中的项,并提供一个单元工厂以在单元工厂内创建标签节点。创建名为“StringImageCell”的类并执行以下操作:
- 您需要设置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);
}
}
公共类ComboBoxCellFactory扩展应用程序{
@凌驾
public void start(Stage)引发异常{
ComboBox ComboBox=新建ComboBox();
comboBox.getItems().addAll(“1”、“2”、“3”);
//设置cellFactory属性
setCellFactory(listview->new StringImageCell());
//设置buttonCell属性
setButtonCell(新的StringImageCell());
BorderPane根=新的BorderPane();
root.setCenter(组合框);
场景=新场景(root,600600);
舞台场景;
stage.show();
}
//显示图像和字符串的自定义列表单元格
静态类StringImageCell扩展了ListCell{
标签;
静态HashMap图片=新建HashMap();
@凌驾
受保护的void updateItem(字符串项,布尔值为空){
super.updateItem(项,空);
如果(项==null | |空){
setItem(null);
设置图形(空);
}否则{
setText(项目);
ImageView image=getImageView(项目);
标签=新标签(“,图像);
设置图形(标签);
}
}
}
私有静态ImageView getImageView(字符串imageName){
ImageView ImageView=null;
开关(imageName){
案例“1”:
案例“2”:
案例“3”:
如果(!pictures.containsKey(imageName)){
图片。放置(imageName,新图片(imageName+“.png”);
}
imageView=新的imageView(pictures.get(imageName));
打破
违约:
imageName=null;
}
返回图像视图;
}
公共静态void main(字符串[]args){
发射(args);
}
}
我认为没有显示足够的代码。例如,setNat函数。为什么要将整数与字符串进行比较?您的问题很奇怪,尽管setNat()
是私有字符串nat的setter
。。但是关于比较,我采取了这个方法,因为它是从互联网上(怪我:p)如果有其他的可能做同样的事情,请启发我:(我是一个初学者…(对不起我的英语)尝试删除=new ComboBox()
。您不需要创建ComboBox的实例。它是由JavaFX应用程序线程在运行时创建的。在“关于将节点插入ComboBox项目列表的警告”下可以解决这个问题。底线是,您不应该使用节点
类型作为组合框
的数据类型。感谢@James\u D,这是我的错,我以前应该读过:(但我怎么能用另一种方式来做呢?
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);
}
}