【问题标题】:Javafx radio button binding directionallyJavafx单选按钮定向绑定
【发布时间】:2019-02-23 09:36:49
【问题描述】:

我还是 javafx 的新手,我想对单选按钮执行定向绑定

在我的 fxml 中我有

  <fx:define>
          <ToggleGroup fx:id="version_selection" />                  
  </fx:define> 
  <RadioButton toggleGroup="$version_selection" ............> 
  <RadioButton toggleGroup="$version_selection" ............> 

在我的控制器中,我想绑定所选切换组的值。使用文本字段就简单了

 @FXML
TextField name;

@FXML
private ToggleGroup version_selection;

  name.textProperty().bindBidirectional(model.field5Property());

模型是我的具有 SimpleStringValue 属性的类

我如何绑定切换组,因为它没有文本属性作为文本字段

【问题讨论】:

    标签: java javafx


    【解决方案1】:

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

    使用Map&lt;String, Toggle&gt; 将文本转换为要选择的切换开关。以下示例使用TextField 来确定属性而不是模型属性来演示行为:输入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();
    }
    

    【讨论】:

    • 在定向绑定中,我需要用户选择单选按钮,并且在其他情况下,例如在更新期间以预选单选按钮。所以两个方向
    猜你喜欢
    • 1970-01-01
    • 2011-02-07
    • 2016-04-10
    • 2017-03-04
    • 1970-01-01
    • 2011-01-20
    • 2012-02-12
    • 2015-10-31
    • 2011-10-06
    相关资源
    最近更新 更多