Combobox 组合框清除值问题

Combobox 组合框清除值问题,combobox,javafx-2,javafx-8,selectionmodel,Combobox,Javafx 2,Javafx 8,Selectionmodel,我偶然发现javafx2.2中的组合框存在一个问题。这是一个场景: 用户单击“编辑文件”按钮 另一个窗格变为可见(使用setVisible方法) 此窗格包含6个组合框。 其中三个有固定项:cboReport、cboSales、cboSend。其中三个从db(ObservableList)获取数据,并在窗格可见时填充:cboFile、cboCustomer、cboVet 用户从cboFile中选择一个文件号。其余的组合框都设置了正确的值 用户按下保存按钮,文件将按预期保存 接下来,用户按下关

我偶然发现javafx2.2中的组合框存在一个问题。这是一个场景:

  • 用户单击“编辑文件”按钮
  • 另一个窗格变为可见(使用setVisible方法)
此窗格包含6个组合框。 其中三个有固定项:cboReport、cboSales、cboSend。其中三个从db(ObservableList)获取数据,并在窗格可见时填充:cboFile、cboCustomer、cboVet

  • 用户从cboFile中选择一个文件号。其余的组合框都设置了正确的值
  • 用户按下保存按钮,文件将按预期保存
  • 接下来,用户按下关闭按钮
当窗口关闭时,窗格上的数据将通过resetGUI_editFilePane()方法重置。有以下几行:

...
cboReport.getSelectionModel().clearSelection();
cboSales.getSelectionModel().clearSelection();
cboSend.getSelectionModel().clearSelection();
cboFile.getSelectionModel().clearSelection();
cboCustomer.getSelectionModel().clearSelection();
cboVet.getSelectionModel().clearSelection();

cboFile.getItems().clear();
cboCustomer.getItems().clear();
cboVet.getItems.clear();
...
当用户再次按“编辑文件”按钮打开窗格时,我注意到只有“固定项目”组合框清除了它们的选择,动态填充的组合框显示最后选择的项目,尽管选择本身的值为
null
。这看起来像是一个图形错误,还是我做错了什么

有没有办法解决这个问题,或者重置组合框的最佳方法是什么

编辑2014/08/27:
这正式不是一个bug(clearSelection()不清除值):

官方的“解决方法”是在清除选择后清除组合框的值

cb.getSelectionModel().clearSelection();
// Clear value of ComboBox because clearSelection() does not do it
cb.setValue(null);

我遇到了几乎完全相同的情况,在寻找解决方案时遇到了你的问题。幸运的是,我想出了一个解决办法,强制组合框重置。重置窗格上的数据时,不要执行以下操作:

cboVet.getSelectionModel().clearSelection();
cboVet.getItems.clear();
像这样做

parentNode.getChildren().remove(cboVet);
cboVet = new ComboBox();  // do whatever else you need to format your ComboBox
parentNode.add(cboVet);

您还需要在组合框上再次执行setItems(),以便填充新的组合框。这不是一个理想的解决方案,但它似乎与我所期望的clearSelection()方法一样有效。

我使用反射,直接操纵组合框蒙皮中的buttonCell字段:

@SuppressWarnings({ "rawtypes", "unchecked" })
public static <T> void resetComboBox(ComboBox<T> combo) {
    Skin<?> skin = combo.getSkin();
    if(skin==null){
        return;
    }
    combo.setValue(null);
    Field buttonCellField;
    try {
        buttonCellField = skin.getClass().getDeclaredField("buttonCell");
        buttonCellField.setAccessible(true);
        ListCell buttonCell = (ListCell) buttonCellField.get(skin);
        if(buttonCell!=null){
            StringProperty text = buttonCell.textProperty();
            text.set("");
            buttonCell.setItem(null);
        }
    } catch (NoSuchFieldException 
            | SecurityException 
            | IllegalArgumentException 
            | IllegalAccessException e) {
        e.printStackTrace();
    }

}
@SuppressWarnings({“rawtypes”,“unchecked”})
公共静态无效重置组合框(组合框组合){
皮肤=combo.getSkin();
如果(皮肤==null){
返回;
}
combo.setValue(null);
字段按钮celfield;
试一试{
buttonCellField=skin.getClass().getDeclaredField(“buttonCell”);
buttonCellField.setAccessible(true);
ListCell buttonCell=(ListCell)buttonCellField.get(skin);
如果(buttonCell!=null){
StringProperty text=buttonCell.textProperty();
text.set(“”);
buttonCell.setItem(空);
}
}catch(NoSuchFieldException
|安全例外
|非法辩论例外
|非法访问(例外e){
e、 printStackTrace();
}
}

我认为,通过buttonCellFactory属性提供您自己的buttonCell实现也是可能的,您可以检索项目并将其全部删除:

cboVet.getItems().removeAll(cboVet.getItems());

我对组合框也有同样的问题。当我更改组合框的项目时,组合框的buttonCell没有正确更新。这看起来像是一个图形错误

我使用ComboBox中buttonCell字段的直接操作

combo.getButtonCell().setText("");
combo.getButtonCell().setItem(null);

这是我在不重新创建组合框的情况下找到的最佳解决方案。

我刚刚用Java JDK 1.7.11测试了一个有效的解决方案:

combo.getButtonCell().setText("");
combo.getButtonCell().setItem(null);
combobox.setSelectedItem(null);
combobox.setValue(null);

希望有帮助:)

要清除SelectionModel,我发现没有什么比创建Combobox的新实例更好的了(以前的答案更新):

但是这个解决方案会产生其他问题:如果使用fxml,这个组合框将被放置在错误的位置,并且使用错误的参数。有些fxml参数很难直接从控制器类代码中复制,每次需要清除组合框时都这样做很糟糕

解决方案是使用自定义组件,而不是直接在主控制器类代码中创建实例,即使这些组件是标准组件。这也有助于通过将组件相关的事件方法和其他方法移动到单独的类文件(在该文件中使用对主控制器类的引用)来释放主控制器类中的一些行

可以在中找到如何在JavaFX FXML应用程序中创建自定义组件,但请注意,应用程序中的每个自定义组件都不需要CustomControlExample类,如果它已经有一个带有start(Satge stage)方法的入口点类


如何解决从自定义组件控制器类到主控制器类的引用中可能出现的错误,请参见

,非常简单。您只需要使用ComboBox的value属性。给你

ComboBox c;
c.valueProperty().set(null);

我希望这对您有用:-D

我需要清除组合框的选择。这个代码对我来说很有用:

 List<Object> list = new ArrayList<>(comboBox.getItems());
 comboBox.getItems().removeAll(list);
 comboBox.getItems().addAll(list);
List List=newarraylist(comboBox.getItems());
comboBox.getItems().removeAll(列表);
comboBox.getItems().addAll(列表);

对于1.7.25+版本,执行myCombobox.getSelectionModel().clearSelection();对我来说很好。无需删除整个组合框或任何内容的坦克很多!!救了我一天。这是这个问题的真实答案。很高兴帮助卡拉什尼。我很高兴这个解决方案对您有效。这也是“解决”它的官方方式。请参见上述编辑2014/08/27。谢谢。已经找了一段时间了。是的,ComboBox.setValue(null);或者在我的实例ChoiceBox.setValue(null)中,似乎是完成请求的最简单的方法。公认的答案似乎有些过分,这要简单得多