我在start方法中有这个代码:
ObservableList<StringBuilder> list = FXCollections.observableArrayList();
list.add(new StringBuilder("0"));
list.add(new StringBuilder("1"));
list.add(new StringBuilder("2"));
list.add(new StringBuilder("3"));
list.add(new StringBuilder("4"));
list.add(new StringBuilder("5"));
list.add(new StringBuilder("6"));
list.add(new StringBuilder("7"));
list.add(new StringBuilder("8"));
list.add(new StringBuilder("9"));
ComboBox<StringBuilder> combo = new ComboBox<>(list);
Button change = new Button("change");
change.setOnAction((event) -> {
list.set(5, new StringBuilder("-"));
});
BorderPane borderPane = new BorderPane(combo, null, null, change, null);
Scene scene = new Scene(borderPane);
primaryStage.setScene(scene);
primaryStage.show();
我启动程序并选择第二项,然后点击&#34;更改&#34;按钮好几次。什么都没发生,这很好。 但如果我选择项目&#34; 6&#34;并点击&#34;更改&#34;按钮然后comboBox自动选择下一个项目(&#34; 7&#34;)。 为什么会这样?
然后我们可以改变行
list.set(5, new StringBuilder("-");
在
list.remove(5);
然后,如果我选择项目&#34; 2&#34;然后点击&#34;更改&#34;按钮然后什么都没发生如果我选择项目&#34; 9&#34;然后点击&#34;更改&#34;按钮然后comboBox自动选择上一个项目(&#34; 8&#34;)。
我希望如果我只是改变项目,即使用list的set方法,那么comboBox不会改变选择。如何应对?
答案 0 :(得分:3)
我不确定为什么会发生这种情况,这可能与ComboBox
处理ObservabeList
的方式有关。但是这不能使用ChoiceBox
复制。你能和JavaFX团队一起提出JIRA
,以便他们看看吗?
作为一种转变,您可以在代码中执行以下操作以暂时修复它:
ComboBox<String> combo = new ComboBox<String>(list);
Button change = new Button("change");
change.setOnAction((event) -> {
StringBuilder str = combo.getValue();
list.set(5, new String("-"));
combo.setValue(str);
});
答案 1 :(得分:2)
在这种情况下你可以使用ChoiceBox,它对我来说很好。只需用ChoiceBox替换ComboBox即可。但是在选择5时按下按钮并不会将标题刷新为&#34; - &#34;。
答案 2 :(得分:1)
我认为这可能是bugs.openjdk.java.net/browse/JDK-8087838
:ComboBox: Root observable list changing causes very strange selection issues, which is sort of fixed on Java 9, for general availablility Sep 2016
。另请参阅this问题