使JavaFX radiobutton事件仅触发一次

使JavaFX radiobutton事件仅触发一次,javafx,toggle,radio,Javafx,Toggle,Radio,我在Oracle演示页面上有单选按钮和事件侦听器。 它可以工作,它可以将数据保存到数据库中,但问题是,它的发射次数与组中的无线电发射次数相同。 我希望它只被切换一次,这样我就可以只处理一次数据 以下是相关的代码注释我有许多广播组,所以我使用地图: private Map<Integer, RadioButton> Radios = new HashMap<>(); private Map<Integer, ToggleGroup> RadioGroups =

我在Oracle演示页面上有单选按钮和事件侦听器。 它可以工作,它可以将数据保存到数据库中,但问题是,它的发射次数与组中的无线电发射次数相同。 我希望它只被切换一次,这样我就可以只处理一次数据

以下是相关的代码注释我有许多广播组,所以我使用地图:

private Map<Integer, RadioButton> Radios = new HashMap<>();
private Map<Integer, ToggleGroup> RadioGroups = new HashMap<>();

(...)
DrawRadio (int group, int id, String label) {

    if (RadioGroups.get(group) == null) {
        RadioGroups.put(group, new ToggleGroup());
    }

    (...)

    Radios.put(id, new RadioButton(label));
    Radios.get(id).setToggleGroup(RadioGroups.get(group));
    Radios.get(id).setUserData(ans_id);

    (...)

    RadioGroups.get(group).selectedToggleProperty().addListener(new ChangeListener<Toggle>(){
        public void changed(ObservableValue<? extends Toggle> ov, Toggle old_toggle, Toggle new_toggle) {

            if (RG.getSelectedToggle().equals(new_toggle)) {
                System.out.println ("Called with ov:" + ov + ", old_tgl:" + old_toggle.toString() + " and new_tgl: " + new_toggle.toString());
            }
        }
    }
}
我只想要一次,所以:


我把它修好了。正如我之前所说,问题正如乌鲁克指出的那样——每次调用函数时,我都创建了事件侦听器

修复方法是添加检查是否第一次生成放射组:

DrawRadio (int group, int id, String label) {

    boolean AddListener = false;

    if (RadioGroups.get(group) == null) {
        AddListener = true;
        RadioGroups.put(group, new ToggleGroup());
    }

    (...)
    if (AddListener == true) {
        RadioGroups.get(group).selectedToggleProperty().addListener(new ChangeListener<Toggle>(){
            public void changed(ObservableValue<? extends Toggle> ov, Toggle old_toggle, Toggle new_toggle) {

                if (RG.getSelectedToggle().equals(new_toggle)) {
                    System.out.println ("Called with ov:" + ov + ", old_tgl:" + old_toggle.toString() + " and new_tgl: " + new_toggle.toString());
                }
            }
        }
    }
}

我试图复制您的问题,但无法复制。我想看看您在代码中做了什么。你能为此创建一个吗?调试你的组。getgroup。。。密码您可能不止一次将同一个侦听器添加到同一属性。是的,这就是问题所在-每次我调用DrawRadio时,我都添加了事件侦听器!
Called with ov:ReadOnlyObjectProperty [value: RadioButton@3814fb6f[styleClass=radio-button]'b'], old_tgl:RadioButton@5b417598[styleClass=radio-button]'a' and new_tgl: RadioButton@3814fb6f[styleClass=radio-button]'b'
DrawRadio (int group, int id, String label) {

    boolean AddListener = false;

    if (RadioGroups.get(group) == null) {
        AddListener = true;
        RadioGroups.put(group, new ToggleGroup());
    }

    (...)
    if (AddListener == true) {
        RadioGroups.get(group).selectedToggleProperty().addListener(new ChangeListener<Toggle>(){
            public void changed(ObservableValue<? extends Toggle> ov, Toggle old_toggle, Toggle new_toggle) {

                if (RG.getSelectedToggle().equals(new_toggle)) {
                    System.out.println ("Called with ov:" + ov + ", old_tgl:" + old_toggle.toString() + " and new_tgl: " + new_toggle.toString());
                }
            }
        }
    }
}