Combobox clearing value issue
Asked Answered
S

8

25

I've stumbled on an issue with Comboboxes in javafx2.2. This is the scenario:

  • Users click on the 'editFile' button.
  • Another pane becomes visible (with the setVisible method).

This pane contains 6 comboboxes. Three of them have fixed items: cboReport, cboSales, cboSend. Three of them get their data from a db (ObservableList) and get populated when the pane becomes visible: cboFile, cboCustomer, cboVet

  • The user selects a file number from the cboFile. The rest of the comboboxes are beeing set with the correct values.
  • The user presses the save button, the file gets saved as intended.
  • Next the user presses a close button.

When the window closes, the data on the pane gets resetted through a resetGUI_editFilePane() method. There is have lines like:

...
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();
...

When the user opens the pane again by pressing the 'editFile' button I notice that only the 'fixed item' comboboxes have cleared their selection, the dynamicly filled comboboxes show the last selected item although the value from the selection itself is null. This looks like a graphics bug to me or am I doing something wrong?

Is there any way around this issue or what is the best method to reset a combobox?

EDIT 2014/08/27:
This is officially not a bug(clearSelection() does not clear value):
https://bugs.openjdk.java.net/browse/JDK-8097244

The official "workaround" is to clear the value of the ComboBox after clearing selection.

cb.getSelectionModel().clearSelection();
// Clear value of ComboBox because clearSelection() does not do it
cb.setValue(null);
Sinking answered 27/8, 2012 at 13:1 Comment(0)
B
21

I ran into nearly the exact same situation and came across your question while looking for a solution. Fortunately, I came up with a workaround that forces the ComboBoxes to reset. When you reset the data on your pane, instead of doing something like:

cboVet.getSelectionModel().clearSelection();
cboVet.getItems.clear();

do something like this...

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

You'll also need to do a setItems() again on your ComboBox so the new one will be populated. This is not an ideal solution but it seems to be working as I expect the provided clearSelection() method would.

Banderillero answered 9/11, 2012 at 19:26 Comment(1)
For those that are 1.7.25+ ,doing a myCombobox.getSelectionModel().clearSelection(); worked fine for me. No need to remove the whole combobox or anythingNiemi
I
28

It is very simple. You just need to work with the value property of ComboBox. here you go ....

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

I hope this works for you :-D

Induplicate answered 6/12, 2013 at 9:48 Comment(5)
thanks A LOT!! saved my day. this is the actual answer to this question.Summers
Happy to help Kalaschni. I'm glad that this solution worked for you.Induplicate
this is also the offical way to "solve" it. see edit 2014/08/27 above.Summers
Thanks. Been looking for this for a while.Levator
Actually this is the most reasonable solutionCatfish
B
21

I ran into nearly the exact same situation and came across your question while looking for a solution. Fortunately, I came up with a workaround that forces the ComboBoxes to reset. When you reset the data on your pane, instead of doing something like:

cboVet.getSelectionModel().clearSelection();
cboVet.getItems.clear();

do something like this...

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

You'll also need to do a setItems() again on your ComboBox so the new one will be populated. This is not an ideal solution but it seems to be working as I expect the provided clearSelection() method would.

Banderillero answered 9/11, 2012 at 19:26 Comment(1)
For those that are 1.7.25+ ,doing a myCombobox.getSelectionModel().clearSelection(); worked fine for me. No need to remove the whole combobox or anythingNiemi
A
8

You can retrieve the items and have them all removed:

cboVet.getItems().removeAll(cboVet.getItems());
Auroreaurous answered 6/1, 2013 at 14:43 Comment(0)
C
4

I've just tested a working solution with the Java JDK 1.7.11:

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

Hope it helps :)

Carter answered 14/3, 2013 at 17:9 Comment(1)
Yes, ComboBox.setValue(null); or in my instance ChoiceBox.setValue(null) seems like the easiest way to accomplish what is being asked. The accepted answer seems like overkill, this is much more simpleMinstrelsy
Q
2

I use reflection with direct manipulation of buttonCell field in ComboBox skin:

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

}

I think it's also possible by providing your own buttonCell implementation through buttonCellFactory property

Queenhood answered 19/11, 2012 at 15:39 Comment(0)
R
1

I had the same problem with a ComboBox. The buttonCell of the ComboBox is not updated correctly when I change the items of the ComboBox. This looks like a graphics bug.

I use direct manipulation of buttonCell field in ComboBox.

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

This is the best solution I've found without recreate the ComboBox.

Reclamation answered 1/3, 2013 at 16:17 Comment(0)
C
1

To clear SelectionModel I found nothing better than creating a new instance of Combobox (previous answers update):

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

But this solution evolves other problems: if you use fxml, this combobox will be placed in the wrong place and with wrong parameters. Some fxml parameters are hardly reproduced directly from your controller class code and this is awful to do it every time you need to clear the combobox.

The solution is using custom components instead of creating instances directly in main controller class code, even if these components are standard. This also helps to free some lines in your main controller class by moving component related event methods and other methods to a separate class file, where you use a reference to your main controller class.

How to create custom components in JavaFX FXML Application can be found in http://docs.oracle.com/javafx/2/fxml_get_started/custom_control.htm , but note that CustomControlExample class is not needed for every custom component in your application, if it already has an entry point class with start(Satge stage) method.

How to resolve possible errors with reference from custom component controller class to main controller class can be found in JavaFx: how to reference main Controller class instance from CustomComponentController class?

Continue answered 8/7, 2013 at 16:32 Comment(0)
M
1

I need to clear selection of the combo box. And this code worked for me:

 List<Object> list = new ArrayList<>(comboBox.getItems());
 comboBox.getItems().removeAll(list);
 comboBox.getItems().addAll(list);
Mahla answered 3/7, 2018 at 19:20 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.