Java 在可观察的SimpleApproperty中包装枚举映射

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

我需要向JavaFX服务类添加SimpleApproperty,但如果使用正确的方法,我不确定的语法是否正确。请注意,我并不是想让JavaFX服务看起来像一个javabean,我只需要知道如何从可以是TYPEA或TYPEB的enum ModuleType和相关的布尔标志侦听对EnumMap的更新。本质上,这可以看作是一对封装在单个枚举映射中的看门狗计时器

我在理解如何添加基础EnumMap条目时遇到了困难,上面描述的每个ModuleType都应该有2-1个条目

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