组合框奇怪的行为(JavaFX 8)

Posted

技术标签:

【中文标题】组合框奇怪的行为(JavaFX 8)【英文标题】:ComboBox strange behaviour (JavaFX 8) 【发布时间】:2014-11-26 12:05:51 【问题描述】:

我在启动方法中有这段代码:

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

我启动程序并选择第二个项目,然后多次单击“更改”按钮。什么都没有发生,这很好。 但是如果我选择项目“6”并单击“更改”按钮,那么组合框会自动选择下一个项目(“7”)。 为什么会发生?

那我们就可以换行了

list.set(5, new StringBuilder("-");

list.remove(5);

然后,如果我选择项目“2”并单击“更改”按钮,则不会发生任何事情。如果我再次选择项目“9”并单击“更改”按钮,那么组合框会自动选择上一个项目(“8”)。

我希望如果我只是更改项目,即使用列表的 set 方法,那么组合框不会更改选择。如何应对?

【问题讨论】:

【参考方案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问题

【讨论】:

【参考方案2】:

在这种情况下,您可以使用 ChoiceBox,它对我来说效果很好。只需将 ComboBox 替换为 ChoiceBox。但选择5时按下按钮不会刷新标题到“ - ”。

【讨论】:

【参考方案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);
);

【讨论】:

以上是关于组合框奇怪的行为(JavaFX 8)的主要内容,如果未能解决你的问题,请参考以下文章

javafx 组合框下拉菜单从屏幕边缘出来

组合框依赖于另一个组合框 - JavaFX

单击时在JavaFX中填充组合框

JavaFX:使用对象属性的组合框

JavaFX:以编程方式展开组合框

JavaFX 自动完成组合框下拉大小