Java 在可观察的SimpleApproperty中包装枚举映射
我需要向JavaFX服务类添加SimpleApproperty,但如果使用正确的方法,我不确定的语法是否正确。请注意,我并不是想让JavaFX服务看起来像一个javabean,我只需要知道如何从可以是TYPEA或TYPEB的enum ModuleType和相关的布尔标志侦听对EnumMap的更新。本质上,这可以看作是一对封装在单个枚举映射中的看门狗计时器 我在理解如何添加基础EnumMap条目时遇到了困难,上面描述的每个ModuleType都应该有2-1个条目Java 在可观察的SimpleApproperty中包装枚举映射,java,javafx,listener,observable,Java,Javafx,Listener,Observable,我需要向JavaFX服务类添加SimpleApproperty,但如果使用正确的方法,我不确定的语法是否正确。请注意,我并不是想让JavaFX服务看起来像一个javabean,我只需要知道如何从可以是TYPEA或TYPEB的enum ModuleType和相关的布尔标志侦听对EnumMap的更新。本质上,这可以看作是一对封装在单个枚举映射中的看门狗计时器 我在理解如何添加基础EnumMap条目时遇到了困难,上面描述的每个ModuleType都应该有2-1个条目 public class UDPL
public class UDPListenerService extends Service<Void> {
// 'watchdog' property
private final MapProperty<ModuleType, Boolean> watchdog;
// 'watchdog' SimpleMapProperty bound property getter
public ObservableMap<ModuleType, Boolean> getWatchdog() {
return watchdog.get();
}
// 'watchdog' SimpleMapProperty bound property setter
public void setWatchdog(ObservableMap<ModuleType, Boolean> aValue) {
watchdog.set(aValue);
}
// 'watchdog' SimpleMapProperty bound property
public MapProperty<ModuleType, Boolean> watchdogProperty() {
return watchdog;
}
/**
* Constructor
*/
public UDPListenerService()
{
this.watchdog = new SimpleMapProperty<>(
FXCollections.observableHashMap());
}
@Override
protected Task<Void> createTask() {
return new Task<Void>() {
@Override
protected Void call() throws Exception {
updateMessage("Running...");
while (!isCancelled()) {
try {
Thread.sleep(1000);
Platform.runLater(() -> {
try {
// update do some processing here
// . . .
// pet the watchdog
// setWatchdog
if (testforModuleType==ModuleType.TYPEA) {
// please help with syntax
setWatchdog(ModuleType.TYPEA, false);
} else {
// please help with syntax
setWatchdog(ModuleType.TYPEB, false);
}
} catch (StatusRuntimeException ex) {
// watchdog timed out - listener will
// update gui components
if (testforModuleType==ModuleType.TYPEA) {
// please help with syntax
setWatchdog(ModuleType.TYPEA, true);
} else {
// please help with syntax
setWatchdog(ModuleType.TYPEB, true);
}
}
});
} catch (InterruptedException ex) {}
}
updateMessage("Cancelled");
return null;
}
};
}
}
我使用该类的方式是在JavaFX控制器类中,在该类中我添加了一个侦听器,该侦听器根据关联的布尔标志是真是假来填充java gui元素。通常这种行为使用只读映射属性,即仅具有getter的observeMap字段。只修改地图的内容;在指定初始贴图后,不会将新贴图指定给字段
private final ObservableMap<ModuleType, Boolean> watchdog;
public ObservableMap<ModuleType, Boolean> getWatchdog() {
return watchdog;
}
initMapListeners的以下两种实现都将基于映射值设置CheckBox.selected状态
private void initMapListeners() {
checkBoxA.selectedProperty().bind(Bindings.valueAt(map, ModuleType.TYPEA));
checkBoxB.selectedProperty().bind(Bindings.valueAt(map, ModuleType.TYPEB));
}
是否确实要替换贴图而不是简单地修改它。在后一种情况下,只读映射属性,即只有getter的observeMap更合适…@fabian对observeMap包装的基础值的更改是我感兴趣的内容,以侦听更改。你有没有一个我可以这样做的例子?这是否只是构造FXCollections.observableHashMapenumMapdefault的问题,其中enumMapDefault包含一个带有问题中描述的2个键的默认映射
private void initMapListeners() {
checkBoxA.selectedProperty().bind(Bindings.valueAt(map, ModuleType.TYPEA));
checkBoxB.selectedProperty().bind(Bindings.valueAt(map, ModuleType.TYPEB));
}
private void initMapListeners() {
map.addListener((MapChangeListener.Change<? extends ModuleType, ? extends Boolean> change) -> {
if (change.wasAdded()) {
if (change.getKey() == ModuleType.TYPEA) {
checkBoxA.setSelected(change.getValueAdded());
} else if (change.getKey() == ModuleType.TYPEB) {
checkBoxB.setSelected(change.getValueAdded());
}
}
});
}