【问题标题】:Javafx ComboBox disappearing items after select选择后Javafx ComboBox消失的项目
【发布时间】:2014-10-11 20:37:52
【问题描述】:

我创建了一个 (JavaFX) combobox,我在其中填充了一个由 HBoxes 组成的可观察列表,这样我就可以显示一个带有一些文本的图像列表单元格。

这显示得很好,除了每当您选择列表中的一项时,它就会消失。一旦你选择了每个项目,它根本不会渲染任何项目。 (您仍然可以通过单击它们之前所在的空间来选择它们。

请问您知道我该如何纠正吗?

我的部分代码如下所示:

public class IconListComboBox {

Group listRoot = new Group();
VBox mainVBox = new VBox();
ComboBox selectionBox = new ComboBox();
List<HBox> list = new ArrayList<HBox>();
ListView<HBox> listView = new ListView<HBox>();
ObservableList<HBox> observableList;



public IconListComboBox(int dimensionX, int dimensionY, ArrayList<String> names, ArrayList<ImageView> icons)
{

    //VBox.setVgrow(list, Priority.ALWAYS);
    selectionBox.setPrefWidth(dimensionY);
    selectionBox.setPrefHeight(40);

    for(int i = 0; i < names.size(); i++)
    {
        HBox cell = new HBox();
        Label name = new Label(names.get(i));
        Label icon = new Label();
        icon.setGraphic(icons.get(i));
        name.setAlignment(Pos.CENTER_RIGHT);
        icon.setAlignment(Pos.CENTER_LEFT);
        icon.setMaxWidth(Double.MAX_VALUE);
        HBox.setHgrow(icon, Priority.ALWAYS);
        cell.getChildren().add(icon);
        cell.getChildren().add(name);
        list.add(cell);


    }

    observableList = FXCollections.observableList(list);
    listView.setItems(observableList);

    listView.setPrefWidth(dimensionX);
    selectionBox.setMaxWidth(dimensionX);
    listView.setMaxWidth(dimensionX);

    selectionBox.setItems(observableList);

    mainVBox.getChildren().add(selectionBox);
    mainVBox.getChildren().add(listRoot);
    //mainVBox.getChildren().add(listView);
    //listRoot.getChildren().add(listView);


}

提前感谢您的帮助!

【问题讨论】:

    标签: image list combobox javafx icons


    【解决方案1】:

    好的,感谢@James_D 的热心帮助,我已经解决了这个问题!

    这适用于像我一样被 Java 文档中给出的示例吓倒的任何人。 (虽然,我下面的描述可能更糟糕!)


    所以,我首先将我想要的布局中的HBox 添加到ComboBox...这是一个坏主意

    所以,在你删除你所做的一切之前,请将HBox 保存在某处,然后执行以下操作:

    1。创建一个新类来保存将进入每个单元格的日期(图像和字符串)。让 getter/setter 来做这件事。我打电话给我的IconTextCell

    2。将以下代码添加到您的ComboBox 所在的类中:

    yourComboBox.setCellFactory(new Callback<ListView<T>, ListCell<T>>() {
    
        @Override public ListCell<T> call(ListView<T> p) {
            return new ListCell<T>() {
                Label name = new Label();
                Label icon = new Label();
                private final HBox cell;
                { 
                    setContentDisplay(ContentDisplay.GRAPHIC_ONLY); 
                    cell = new HBox();
    
                    //HERE, ADD YOUR PRE-MADE HBOX CODE
    
                    name.setAlignment(Pos.CENTER_RIGHT);
                    icon.setAlignment(Pos.CENTER_LEFT);
                    icon.setMaxWidth(Double.MAX_VALUE);
                    HBox.setHgrow(icon, Priority.ALWAYS);
                    cell.getChildren().add(icon);
                    cell.getChildren().add(name);
                }
    
                @Override protected void updateItem(T item, boolean empty) {
                    super.updateItem(item, empty);
    
                    if (item == null || empty) {
                        setGraphic(null);
                    } else {
                        name.setText(item.getLabel());
                        icon.setGraphic(item.getIcon());
                        setGraphic(cell);
                        //HERE IS WHERE YOU GET THE LABEL AND NAME
                    }
               }
          };
      }
    });
    

    您会看到主要内容与我已经制作的内容非常相似,因此不会丢失任何代码。 只需将“T”替换为您自己的类即可表示单元格。

    3。这将在列表中显示您的图标和字符串,但您还需要在按钮中显示(combobox 的灰色顶部选择器部分,又名button)。这样做,我们需要添加以下代码:

    class IconTextCellClass extends ListCell<T> {
        @Override
        protected void updateItem(T item, boolean empty) {
            super.updateItem(item, empty);
            if (item != null) {
                setText(item.getLabel());
            }
        }
    };
    
    selectionBox.setButtonCell(new IconTextCellClass());
    

    ...我就是这样做的。我希望这会有所帮助 - 请将此与我的原始帖子进行比较。实际内容(我在其中创建 HBox 等)显然不是通用的。您可以根据需要使其变得简单或复杂。

    再次感谢您的帮助!我希望这篇文章对其他人有所帮助!

    【讨论】:

      【解决方案2】:

      这正是documentation 在“关于将节点插入 ComboBox 项目列表的警告”下引用的示例。

      组合框中的项目列表应该代表数据,而不是用于显示数据的 UI 组件。问题是HBox 不能在场景图中出现两次:因此它不能同时出现在“选定单元格”和下拉列表中的单元格中。

      相反,创建一个表示您在ComboBox 中显示的数据的类,并使用单元工厂来指示ComboBox 如何显示这些数据。请务必同时设置一个按钮单元格(用于所选项目的单元格)。

      【讨论】:

      • 谢谢@James_D,这确实有帮助。我已经在文档中看到了这一点,但不太了解 .setCellFactory 的工作原理,但仍然不明白。我得调查一下。我可以按照以下方式做一些事情:.setCellFactory(new Callback&lt;ListView&lt;HBox&gt;, ListCell&lt;HBox&gt;&gt;() ... 吗?
      • 或多或少,但您必须将 ComboBox 表单 HBox 的类型更改为用于表示数据的类。因此,您需要一个Callback&lt;ListView&lt;T&gt;, ListCell&lt;T&gt;&gt;,其中T 是代表数据的类。 (在文档中的示例中,表示数据的类是 Color。您需要在这里稍微复杂一些,封装文本和图像。)
      • 非常感谢@James_D。我已经让它工作到我需要“设置按钮单元”的地步。我该怎么做才能将其设置为我在下拉列表中看到的确切布局?他们给出的例子是.setButtonCell(cellFactory.call(null)); 但是我需要把这个放在哪里?在他们使用 给出的示例中,cellFactory 不是变量。 ..我需要将其从 null 更改吗?
      猜你喜欢
      • 1970-01-01
      • 2016-01-17
      • 2013-09-18
      • 2017-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-26
      相关资源
      最近更新 更多