【问题标题】:JavaFX: ComboBox cells disappear when clickedJavaFX:单击时组合框单元格消失
【发布时间】:2015-11-28 12:44:58
【问题描述】:

我正在开发一个使用 javafx 多种输入类型的 java 项目。但由于我使用 标签上带有图像(ImageView)。

1- 组合框看起来是白色!但我需要它是黑色的。

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 中,请帮助!!

谢谢..(对不起我的英语不好)

【问题讨论】:

  • 我认为显示的代码不够多。例如,setNat 函数。而且,为什么要将整数与字符串进行比较?不过你的问题很奇怪
  • setNat()private String nat 的设置器。但关于比较我采用这种方法,因为它来自互联网(怪我:p)如果有另一种可能性做同样的事情启发我:(我是一个初学者..(对不起我的英语)
  • 尝试删除= new ComboBox&lt;Label&gt;()。您不需要创建 ComboBox
  • 这种确切的情况在documentation 中的“关于将节点插入组合框项目列表的警告”下得到解决。最重要的是,您不应该使用 Node 类型作为 ComboBoxdata 类型。
  • 感谢@James_D,这是我的错,我之前应该读过 :( 但我怎么能以另一种方式做到这一点?

标签: java javafx combobox imageview scenebuilder


【解决方案1】:

导致这个问题的原因是当你选择一个ListCell时,它的项目(在我们的情况下是Label)被ComboBox从ListCell(Items observableList)移动到ButtonCell,ButtonCell是一个空的小盒子默认。但是,我们都知道任何 Node 对象都不能在同一场景中的任何位置放置两次,并且由于 ListCell 类没有克隆功能,javafx 将其从最后一个位置删除到新的位置,即 ButtonCell。

解决方法是添加字符串 列表中的项目并提供单元工厂以在单元工厂内创建标签节点。创建一个名为“StringImageCell”的类并执行以下操作:

  • 您需要设置 cellFactory 属性: cb_nat.setCellFactory(listview -&gt; 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);
        }
    
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 2017-11-22
    相关资源
    最近更新 更多