【发布时间】:2019-10-19 08:26:45
【问题描述】:
如何在不使用ChangeListener 的情况下将ObjectProperty 的属性(它本身不是属性)绑定到TextField 的文本属性等其他属性?
更具体地说:
我想让TextField 更改ObjectProperty 的属性。
示例代码:
地图DTO:
public class MapDTO {
private String cityName;
public String getCityName() {
return cityName;
}
public void setCityName(String cityName) {
this.cityName = cityName;
}
}
地图管理器:
public class MapsManager {
private static ObjectProperty<MapDTO> map = new SimpleObjectProperty<>();
public static MapDTO getMap() {
return map.get();
}
public static ObjectProperty<MapDTO> mapProperty() {
return map;
}
public static void setMap(MapDTO map) {
MapsManager.map.set(map);
}
}
绑定测试控制器:
public class BindingTestController {
private TextField cityNameTF = new TextField();
private void initialize() {
// Bind the cityName label to the selected MapsManager mapProperty's cityName
cityNameTF.textProperty().bind(Bindings.createStringBinding(
() -> MapsManager.mapProperty().getValue() == null ? null :
MapsManager.mapProperty().getValue().getCityName(),
MapsManager.mapProperty()));
}
}
我试过了:
从选定的值 String 属性创建一个字符串属性,但它没有成功,我无法找到正确的方法。
cityNameTF.textProperty().bindBidirectional(Bindings.createStringBinding(
() -> selectMapCB.getValue() == null ? null : selectMapCB.getValue().getCityName(),
selectMapCB.valueProperty()));
从 mapProperty 的 String 属性创建一个字符串属性。
cityNameTF.textProperty().bindBidirectional(Bindings.createStringBinding(
() -> MapsManager.getMapProperty().getValue() == null ? null : MapsManager.mapProperty().getValue().getCityName(),
MapsManager.mapProperty()));
两个选项都给出相同的错误:
bindBidirectional (javafx.beans.property.Property<java.lang.String>)
in StringProperty cannot be applied to (javafx.beans.binding.StringBinding)
在这两种情况下,用bind 替换bindBidirectional 都可以,但是我无法更改TextField 中的文本。
我意识到这是因为我将TextField 的文本绑定到cityName 的字符串。所以我想以一种方式绑定它,但方向相反,比如:
MapsManager.mapProperty().????.bind(cityNameTF.textProperty());
但是“????” - 我没有 String 的属性,我不知道如何即时创建 StringBinding 或 StringProperty。
如何在ObjectProperty 的属性和另一个StringProperty 之间手动创建字符串绑定?
【问题讨论】:
-
发布minimal reproducible example。这有点混乱:当您从问题的 GUI 部分开始时,我们不知道大多数对象是什么,而且您似乎正在使用一些第 3 方库。绑定不需要 GUI,因此如果您的问题是关于绑定的,请使用问题开头的纯数据结构。
-
@user1803551 我添加了 MapsManager 和 MapDTO 类。还有什么需要清理或添加的吗? (另外,将“JFXComboBox”和“JFXTextField”视为常规的“ComboBox”和“TextField”,没什么特别的)
-
重复:你需要一些通知变化的东西......无论如何,时间 vor minimal reproducible example
-
@user1803551 完成。那个更好吗?另外,谢谢,我刚刚开始掌握正确提问的技巧。
-
我尝试对 MCVE 提供一些帮助(尽管它仍然无法运行),它应该能更好地捕捉我认为您所要求的内容。基本上,重要的是你有一个对象,如果我理解正确的话,你想根据文本字段的
text属性(或相反?)更改其字段。在“我已尝试”部分,我假设versionTF是cityNameTF,如果是,请更改它。
标签: java javafx data-binding properties object-property