当前位置: 首页 > 知识库问答 >
问题:

ComboBox奇怪的行为(JavaFX 8)

干子瑜
2023-03-14

我在启动方法中有以下代码:

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,新的StringBuilder("-");

在…上

list.remove(5);

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

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

共有3个答案

澹台玉石
2023-03-14

我认为这可能是错误。openjdk。JAVAnet/browse/JDK-8087838组合框:根可观察列表的更改会导致非常奇怪的选择问题,这在Java 9上有点固定,以便在2016年9月全面可用。另见这个问题

花和宜
2023-03-14

在这种情况下,你可以使用ChoiceBox,它对我很管用。用ChoiceBox替换ComboBox。但在选择5时按下按钮不会将标题刷新为“-”。

胡飞舟
2023-03-14

我不确定为什么会发生这种情况,这可能与ComboBox处理观察列表的方式有关。但是这不能用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);
});
 类似资料:
  • 我有以下代码来解析一个JSON文件: 要处理以下JSON文件: 如果我执行此代码,我将收到以下错误: 所以我开始一步一步地调试应用程序,看看part processing()中的哪个代码部分抛出了这个异常。令人惊讶的是,那里的所有代码都正常执行:没有抛出异常,也没有返回结果I except。 更让我惊讶的是,当我稍微改变第一种方法的代码时,它可以在不产生异常的情况下工作。 我不知道println方

  • 问题内容: 我有一些面板内的组合框: 在我将项目更新到.NET 4之前还可以,在将项目(和AJAX)更新到.net4之后,这看起来真的很奇怪……我无法解释正确,我将显示: 我该如何解决?:)完整的CSS / ASPX页面在这里-> https://github.com/nCdy/Issues/tree/master/Ajax%20ComboBox(字符串#287) 问题答案: 我有一个类似的问题,

  • 问题内容: 我在GregorianCalendar类中遇到一个奇怪的行为,我想知道我是否真的做得不好。 仅当初始化日期的月份的实际Maximum大于我将日历设置为的月份时,才追加此值。 这是示例代码: 我知道问题是由于日历初始化日期是31天(可能是5月),与设置为2月(28天)的月份混淆了。修复很容易(只需在设置年和月之前将day_of_month设置为1),但是我想知道这确实是想要的行为。有什么

  • 问题内容: 我正在为一个问题而苦苦挣扎,我不明白为什么它不起作用。如何通过将变量传递并转换为? 为什么在顶部代码段中不起作用,但在行下方的底部代码段中起作用? 唯一的区别似乎是添加了一个额外的变量,该变量也被键入为? 问题答案: 该是一种原始类型,同时是一个普通的Java类。您不能在原始类型上调用方法。但是该方法在上可用,如javadoc中所示 有关这些原始类型的更多信息,请参见此处

  • 问题内容: 为什么的到哪里去了? 问题答案: 删除任何字符,并从字符串的开头和结尾。

  • 问题内容: 我认为这是一个正常程序,但这是我得到的输出: 有人可以向我解释一下吗? 问题答案: 这是有据可查的PHP行为,请参阅php.net的foreach页面上的警告。 警告 即使在 foreach 循环之后,仍保留 $ value的 引用和最后一个数组元素。建议通过unset()销毁它。 __ 编辑 尝试逐步了解此处实际发生的情况