当前位置: 首页 > 知识库问答 >
问题:

JavaFX:ComboBox单元格在单击时消失

吴欣然
2023-03-14

我正在做一个使用javafx多种输入类型的java项目。但我有一个扼杀组合框的行为,因为我使用的标签上的图像(ImageView)。

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

每次我选择一个项目。

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" />

编辑:

读了这篇文章后,我知道我的方法完全错误,强烈不推荐。。如果有人有其他想法在组合框中放置国家国旗,请帮助!!

谢谢(抱歉我的英语不好)

共有1个答案

蒙奇
2023-03-14

导致此问题的原因是,当您选择一个列表单元格时,它的项(在我们的情况下是标签)被ComboBox从列表单元格(Items observableList)移动到ButtonCell,ButtonCell是默认为空的小框。然而,我们都知道,任何节点对象都不能在同一场景中的任何位置放置两次,而且由于ListCell类没有克隆函数,javafx将其从最后一个位置移到新的位置,即ButtonCell。

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

  • 您需要设置cellFactory属性:cb_nat。setCellFactory(列表视图)-

下面是一个例子:

     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);
        }
    
    }

 类似资料:
  • 问题内容: 单击时,我必须调整tableView的一行的大小。我该怎么做?有人可以帮助我吗? 我的视图控制器类: 问题答案: 首先,您必须跟踪属性中当前选定单元格的indexPath: 它应该是可选的,因为您不能选择任何单元格。接下来让我们声明选定状态和未选定状态的高度(将值更改为所需的值): 现在您必须实现: 现在,在您的方法中,您必须检查是否选中了选定行或未选定行: 该和电话是给你一个动画的高

  • 问题内容: 我一直在尝试在我的应用程序中实现一项功能,以便当用户在我的表格视图中点击一个单元格时,该单元格会向下扩展以显示注释。我在Objective- C中找到了很多这样的例子,但是我还没有找到Swift的例子。 我试图将其翻译为Swift: 但是,这似乎使应用程序崩溃了。 有任何想法吗? 编辑: 这是我的cellForRowAtIndexPath代码: 这是插座设置: 问题答案: if语句中的

  • 问题内容: 我有一个tableview单元格,其中添加了collectionview单元格(用于水平滚动)。 现在我想在按下水平collectionview的任何单元格时推送到其他导航控制器。怎么做 ?或如何定义细胞压榨的委托方法。 代码: ViewController.swift: CategoryRow.swift VideoCell.swift 问题答案: 在这里,您将在类上的委托方法上单击

  • 单击未选中的可编辑单元格-单元格被选中 双击单元格(随时),执行自定义打开操作 单击选定单元格触发编辑 我需要编写一个检查选择的自定义IEditableRule吗?如果有一种方法可以检查来自W/I这个规则的选择,或者我是否也需要创建一个可以监听整个表选择并统一这些概念的规则?

  • 我们刚刚开始实施NatTable,我们非常高兴看到性能的提高。然而,我们在实现特定功能时遇到了困难。 我们想要的是在单元格中有可点击的文本,然后它将引用我们选择并进入视图的表中的一行。基本上,类似于: 通过单击。

  • 这是我的问题。 我有一个像这样的简单表格(示例): null null 并且我正在尝试列的名称,同时单击元素。 我想这可能是一个简单的解决办法但我找不到。 提前致谢