组合框清除值问题

25
我在javafx2.2中遇到了Comboboxes的问题。情况如下:
  • 用户单击“editFile”按钮。
  • 另一个窗格变得可见(使用setVisible方法)。

此窗格包含6个组合框。其中三个具有固定项:cboReport、cboSales、cboSend。另外三个从数据库(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();
...

当用户通过按下“editFile”按钮再次打开窗格时,我注意到只有“固定项目”组合框已清除其选择,动态填充的组合框显示最后选定的项目,尽管从选择本身的值为null。这看起来像是一个图形错误,或者我做错了什么吗?
有没有什么方法可以解决这个问题,或者重置组合框的最佳方法是什么?
编辑2014/08/27:
这正式不是一个错误(clearSelection()不清除值):
https://bugs.openjdk.java.net/browse/JDK-8097244 官方“解决办法”是在清除选择后清除ComboBox的值。
cb.getSelectionModel().clearSelection();
// Clear value of ComboBox because clearSelection() does not do it
cb.setValue(null);
8个回答

27

很简单。你只需要使用ComboBox的"value"属性进行操作。就这样....

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

我希望这对你有用 :-D


2
非常感谢!你救了我的一天。这是这个问题的实际答案。 - Kalaschni
很高兴能帮助Kalaschni。我很高兴这个解决方案对你有用。 - Himanshu ARORA
1
这也是“解决”它的官方方式。请参见上面的2014/08/27编辑。 - Kalaschni
谢谢。我已经寻找这个东西有一段时间了。 - Kefirchiks
实际上这是最合理的解决方案。 - Mateusz Niedbal

21

我遇到了几乎完全相同的情况,在寻找解决方案时偶然发现了你的问题。幸运的是,我想出了一个解决办法来强制 ComboBoxes 重置。当您在面板上重置数据时,而不是像这样做:

我遇到了类似的问题,并且在寻找解决方法时看到了你的提问。好在我想出了一个解决办法,可以强制ComboBoxes重置。当您重置面板上的数据时,不要像这样做:

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()方法。

2
对于那些使用1.7.25+版本的人,执行_myCombobox.getSelectionModel().clearSelection();_ 对我来说很有效。不需要删除整个组合框或其他任何东西。 - francisOpt

8

您可以检索项目并将它们全部移除:

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

4

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

combobox.setSelectedItem(null);
combobox.setValue(null);

希望它有所帮助 :)

是的,ComboBox.setValue(null); 或者在我的情况下 ChoiceBox.setValue(null) 看起来是实现所需功能最简单的方法。被接受的答案似乎有些过度,这种方式更加简单。 - ViaTech

2
我在ComboBox皮肤中使用反射直接操作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();
    }

}

我认为通过提供自己的buttonCell实现,可以通过buttonCellFactory属性来实现。

1

清除SelectionModel,我发现没有比创建Combobox的新实例更好的方法(之前的答案已更新):

myParentNode.getChildren().remove(myCombobox);
myCombobox = new ComboBox();
myParentNode.add(myCombobox);

但是这种解决方案会带来其他问题:如果您使用fxml,此组合框将放置在错误的位置并具有错误的参数。某些fxml参数很难直接从控制器类代码中重现,每次需要清除组合框时都要这样做非常糟糕。
解决方案是使用自定义组件而不是直接在主控制器类代码中创建实例,即使这些组件是标准的。这还通过将组件相关的事件方法和其他方法移动到单独的类文件中来释放主控制器类中的一些行,其中您使用对主控制器类的引用。
如何在JavaFX FXML应用程序中创建自定义组件可以在http://docs.oracle.com/javafx/2/fxml_get_started/custom_control.htm中找到,但请注意,对于应用程序中的每个自定义组件,都不需要CustomControlExample类,如果它已经具有具有start(Satge stage)方法的入口点类。
在自定义组件控制器类中引用主控制器类可能出现错误的解决方法可以在JavaFx:如何从CustomComponentController类引用主Controller类实例中找到?

1
我有一个ComboBox的同样问题。当我改变ComboBox的项目时,ComboBox的buttonCell没有正确更新。这看起来像是一个图形错误。
我在ComboBox中直接操作buttonCell字段。
combo.getButtonCell().setText("");
combo.getButtonCell().setItem(null);

这是我找到的最佳解决方案,无需重新创建ComboBox。


1
我需要清除组合框的选择。这段代码对我有效:
 List<Object> list = new ArrayList<>(comboBox.getItems());
 comboBox.getItems().removeAll(list);
 comboBox.getItems().addAll(list);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接