gpt4 book ai didi

JavaFX ComboBox 不更新值

转载 作者:行者123 更新时间:2023-12-02 11:05:53 26 4
gpt4 key购买 nike

经过几个小时的寻找答案后,我终于放弃了。我有一个带有以下组合框的 FXML 表单:

<ComboBox fx:id="cboTipo" disable="true" prefWidth="247.0" promptText="Tipo de obra..." GridPane.columnIndex="1" GridPane.rowIndex="2" />

它被注入(inject)到 JavaFX Controller 类中:

    @FXML
public ComboBox<Tobra> cboTipo;

该组合显示了使用 Eclipselink 2.7 和 JPA 2.2 从嵌入式 H2 数据库加载的 Tobra(西类牙语代表:Tipo de Obra)列表。

我没有向用户显示 Tobra.toString 的值,而是在初始化中设置了一个转换器:

@Override
public void initialize(URL url, ResourceBundle rb) {
...
Objects.requireNonNull(cboTipo, "cboTipo not injected");
...
cboTipo.setConverter(new StringConverter<Tobra>() {
@Override
public String toString(Tobra object) {
return object.getCod() + ": " + object.getNombre();
}

@Override
public Tobra fromString(String string) {
return new Tobra(string);
}
});
...
}

我有一个实现 Task<List<Tobra>> 的内部类所以我可以在后台加载数据。然后,就成功了:

task.setOnSucceeded(evt ->
cboTipo.setItems(FXCollections.observableArrayList(task.getValue()))
);

当然,当显示表单时,我在线程内运行任务:

 new Thread(task).start();

在代码经过测试之前,一切似乎都工作正常。无论我单击什么值,所选值始终会重置为第一项。我试图从代码中强制输入一些值,它显示在组合框中,但是当用户单击组合以选择另一个值时,所选值再次重置为“第一项”。仅当使用带有类型参数的 ComboBox 时才会出现此行为。当我创建没有类型参数的组合框,然后添加字符串值时,如下所示:

 cboTipo.getItems().clear();
cboTipo.getItems().addAll(
tobraList.stream().map(x
-> x.getCod() + ": " + x.getNombre())
.toArray());

一切正常。

所以我尝试对 POJO Tobra 执行相同的操作,而不映射到字符串:

 cboTipo.getItems().clear();
cboTipo.getItems().addAll(tobraList);

但是问题又出现了。我也尝试过声明 ComboBox cboTipo没有类型参数,但它不起作用。我的 POJO Tobra,以这种方式覆盖 equals 方法:

@Override
public boolean equals(Object object) {
if (!(object instanceof Tobra)) {
return false;
}
var other = (Tobra) object;
return ((this.cod == null && other.cod != null)
|| (this.cod != null && !this.cod.equals(other.cod)));
}

我做错了什么?

PS:我还尝试按照以下建议建立自己的细胞工厂: Javafx combobox with custom object displays object address though custom cell factory is used

尝试和调试它后,我意识到问题不在于组件的渲染,因为 ComboBox 的 value 属性在选择后永远不会更新。

最佳答案

您的equals()方法很奇怪。

return ((this.cod == null && other.cod != null)
|| (this.cod != null && !this.cod.equals(other.cod)));

我们来打破这个局面吧。第 1 部分:

(this.cod == null && other.cod != null)

如果cod这个Tobranullcod其他的Tobra不是null ,那么这部分就是true .

现在整个表达式返回true当这种情况发生时,因为你有一个 ||运算符。

让我们看第二部分。

(this.cod != null && !this.cod.equals(other.cod))

如果cod这个Tobra不是nullcod其他的Tobra 相等,那么这部分是 true .

这看起来又是相反的。

您很可能需要 !整个表情。或者,您可以使用 Objects.equals(this.cod, other.cod) ,它会为您检查 null。

最后,请确保您还覆盖 hashCode()并返回一个不违反 equals() 合约的正确值。阅读 Javadoc 了解更多详细信息。

关于JavaFX ComboBox<POJO> 不更新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50962889/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com