为了账号安全,请及时绑定邮箱和手机立即绑定

Javafx单选按钮定向绑定

Javafx单选按钮定向绑定

达令说 2022-07-06 17:05:14
我还是 javafx 的新手,我想对单选按钮执行定向绑定在我的 fxml 我有  <fx:define>          <ToggleGroup fx:id="version_selection" />                    </fx:define>   <RadioButton toggleGroup="$version_selection" ............>   <RadioButton toggleGroup="$version_selection" ............> 在我的控制器中,我想绑定所选切换组的值。使用文本字段很简单 @FXMLTextField name;@FXMLprivate ToggleGroup version_selection;  name.textProperty().bindBidirectional(model.field5Property());其中模型是我的具有 SimpleStringValue 属性的类我如何绑定切换组,因为它没有文本属性作为文本字段
查看完整描述

1 回答

?
HUH函数

TA贡献1836条经验 获得超4个赞

即使ObjectProperty<Toggle>您的模型中有 a ,您也无法建立双向绑定,因为ToggleGroup.selectedToggle它是只读的。ToggleGroup.selectedToggle您需要通过向属性和模型属性添加侦听器来解决此问题,并在更改时更新更改源以外的属性。


使用 aMap<String, Toggle>将文本转换为要选择的切换。以下示例使用 aTextField来确定属性而不是模型属性来演示行为:输入RadioButton要选择的文本,它将被选中。


@Override

public void start(Stage primaryStage) throws IOException {


    ToggleGroup group = new ToggleGroup();

    VBox vbox = new VBox();


    for (char c = 'a'; c <= 'f'; c++) {

        RadioButton radio = new RadioButton(Character.toString(c));

        radio.setToggleGroup(group);

        vbox.getChildren().add(radio);

    }


    TextField input = new TextField();

    vbox.getChildren().add(input);


    // create map mapping from text to corresponding toggle

    Map<String, Toggle> map = new HashMap<>();      

    for (Toggle t : group.getToggles()) {

        map.put(((RadioButton) t).getText(), t);

    }


    StringProperty property = input.textProperty();


    InvalidationListener listener = new InvalidationListener() {


        // flag preventing circular updating

        boolean updating = false;


        @Override

        public void invalidated(Observable observable) {

            if (!updating) {

                updating = true;


                if (observable == group.selectedToggleProperty()) {

                    // change as result of user interaction with RadioButton


                    // update property

                    RadioButton selectedToggle = (RadioButton) group.getSelectedToggle();

                    property.set(selectedToggle == null ? "" : selectedToggle.getText());

                } else {

                    // change as result of updating the property


                    // select corresponding toggle

                    Toggle toggleToSelect = map.get(property.get());

                    group.selectToggle(toggleToSelect);

                }


                updating = false;

            }

        }


    };


    property.addListener(listener);

    group.selectedToggleProperty().addListener(listener);


    Scene scene = new Scene(vbox);

    primaryStage.setScene(scene);

    primaryStage.show();

}


查看完整回答
反对 回复 2022-07-06
  • 1 回答
  • 0 关注
  • 195 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信