diff --git a/javafx-ui-controls/src/com/sun/javafx/scene/control/skin/ComboBoxListViewSkin.java b/javafx-ui-controls/src/com/sun/javafx/scene/control/skin/ComboBoxListViewSkin.java --- a/javafx-ui-controls/src/com/sun/javafx/scene/control/skin/ComboBoxListViewSkin.java +++ b/javafx-ui-controls/src/com/sun/javafx/scene/control/skin/ComboBoxListViewSkin.java @@ -402,11 +402,12 @@ } } else { int index = getIndexOfComboBoxValueInItemsList(); - if (index > -1) { - buttonCell.setItem(null); - buttonCell.updateListView(listView); - buttonCell.updateIndex(index); - } else { + + buttonCell.setItem(null); + buttonCell.updateListView(listView); + buttonCell.updateIndex(index); + + if (index == -1) { // RT-21336 Show the ComboBox value even though it doesn't // exist in the ComboBox items list (part two of fix) boolean empty = updateDisplayText(buttonCell, value, false); diff --git a/javafx-ui-controls/src/javafx/scene/control/ComboBox.java b/javafx-ui-controls/src/javafx/scene/control/ComboBox.java --- a/javafx-ui-controls/src/javafx/scene/control/ComboBox.java +++ b/javafx-ui-controls/src/javafx/scene/control/ComboBox.java @@ -403,6 +403,11 @@ // when we really should go into the updateValue(t1) call below. // We should only ever go into this clause if t1 is null. wasSetAllCalled = false; + + // Fix for RT-26079 (this unfortunately breaks RT-22572 above) + if (getItems() == null || ! getItems().contains(t)) { + updateValue(null); + } } else { updateValue(t1); } diff --git a/javafx-ui-controls/test/javafx/scene/control/ComboBoxTest.java b/javafx-ui-controls/test/javafx/scene/control/ComboBoxTest.java --- a/javafx-ui-controls/test/javafx/scene/control/ComboBoxTest.java +++ b/javafx-ui-controls/test/javafx/scene/control/ComboBoxTest.java @@ -917,4 +917,33 @@ assertEquals("2", buttonCell.getText()); assertEquals(2, sm.getSelectedIndex()); } + + @Test public void test_rt26079() { + SingleSelectionModel sm = comboBox.getSelectionModel(); + + Stage stage = new Stage(); + Scene scene = new Scene(comboBox); + stage.setScene(scene); + comboBox.impl_processCSS(true); + comboBox.show(); + ListCell buttonCell = (ListCell) getDisplayNode(); + + assertNull(sm.getSelectedItem()); + assertNull(comboBox.getValue()); + assertEquals("", buttonCell.getText()); + assertEquals(-1, sm.getSelectedIndex()); + + comboBox.getItems().setAll("0","1","2","3","4","5","6","7","8","9"); + sm.selectFirst(); + assertEquals("0", sm.getSelectedItem()); + assertEquals("0", comboBox.getValue()); + assertEquals("0", buttonCell.getText()); + assertEquals(0, sm.getSelectedIndex()); + + comboBox.getItems().setAll("10","11","12","13","14","15","16","17","18","19"); + assertNull(sm.getSelectedItem()); + assertNull("Actual value: " + comboBox.getValue(), comboBox.getValue()); + assertEquals("", buttonCell.getText()); + assertEquals(-1, sm.getSelectedIndex()); + } }