diff --git a/modules/javafx.controls/src/main/java/javafx/scene/control/skin/ComboBoxListViewSkin.java b/modules/javafx.controls/src/main/java/javafx/scene/control/skin/ComboBoxListViewSkin.java index 8a40e3e61c..fd2ab4ea77 100644 --- a/modules/javafx.controls/src/main/java/javafx/scene/control/skin/ComboBoxListViewSkin.java +++ b/modules/javafx.controls/src/main/java/javafx/scene/control/skin/ComboBoxListViewSkin.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2020, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -417,8 +417,10 @@ private void updateValue() { T itemsObj = comboBoxItems.get(index); if ((itemsObj != null && itemsObj.equals(newValue)) || (itemsObj == null && newValue == null)) { listViewSM.select(index); + listView.scrollTo(index); } else { listViewSM.select(newValue); + listView.scrollTo(newValue); } } else { // just select the first instance of newValue in the list @@ -429,6 +431,7 @@ private void updateValue() { updateDisplayNode(); } else { listViewSM.select(listViewIndex); + listView.scrollTo(listViewIndex); } } } diff --git a/modules/javafx.controls/src/test/java/test/javafx/scene/control/ComboBoxTest.java b/modules/javafx.controls/src/test/java/test/javafx/scene/control/ComboBoxTest.java index 6ced895d16..89b1878b7c 100644 --- a/modules/javafx.controls/src/test/java/test/javafx/scene/control/ComboBoxTest.java +++ b/modules/javafx.controls/src/test/java/test/javafx/scene/control/ComboBoxTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2020, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -32,6 +32,8 @@ import test.com.sun.javafx.scene.control.infrastructure.KeyEventFirer; import test.com.sun.javafx.scene.control.infrastructure.StageLoader; +import test.com.sun.javafx.scene.control.infrastructure.VirtualFlowTestUtils; + import javafx.scene.control.skin.ComboBoxListViewSkin; import static test.com.sun.javafx.scene.control.infrastructure.ControlTestUtils.assertStyleClassContains; @@ -2058,4 +2060,57 @@ public void test_rt_40012_selectedItemNotificationOnDisjointRemovesAbove() { assertEquals("ComboBox skinProperty changed more than once, which is not expected.", 1, skinChangedCount); } + + @Test public void test_JDK_8129123() { + final int LIST_SIZE = 50; + + ComboBox comboBox = new ComboBox<>(); + + BorderPane p = new BorderPane(); + p.setCenter(comboBox); + + Scene scene = new Scene(p); + + Stage stage = new Stage(); + stage.setScene(scene); + stage.setWidth(500); + stage.setHeight(400); + stage.show(); + + Toolkit.getToolkit().firePulse(); + + for (int i = 0; i < LIST_SIZE; i++) { + comboBox.getItems().add(String.valueOf(i)); + } + comboBox.show(); + + VirtualFlow> virtualFlow = (VirtualFlow>) VirtualFlowTestUtils.getVirtualFlow(comboBox); + + int index = 0; + comboBox.getSelectionModel().select(index); + Toolkit.getToolkit().firePulse(); + + int first = virtualFlow.getFirstVisibleCell().getIndex(); + int last = virtualFlow.getLastVisibleCell().getIndex(); + assertTrue(" visible range [" + first + ", " + last + "] must include " + index, + first <= index && index <= last); + + index = LIST_SIZE / 2; + comboBox.getSelectionModel().select(index); + Toolkit.getToolkit().firePulse(); + + first = virtualFlow.getFirstVisibleCell().getIndex(); + last = virtualFlow.getLastVisibleCell().getIndex(); + assertTrue(" visible range [" + first + ", " + last + "] must include " + index, + first <= index && index <= last); + + index = LIST_SIZE - 1; + comboBox.getSelectionModel().select(index); + Toolkit.getToolkit().firePulse(); + + first = virtualFlow.getFirstVisibleCell().getIndex(); + last = virtualFlow.getLastVisibleCell().getIndex(); + assertTrue(" visible range [" + first + ", " + last + "] must include " + index, + first <= index && index <= last); + } }