Переключатель Javafx привязан по направлению - PullRequest
0 голосов
/ 23 февраля 2019

Я все еще новичок в 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

Как связать группу переключателей, поскольку у нее нет текстового свойства как текстового поля

1 Ответ

0 голосов
/ 23 февраля 2019

Даже если у вас есть ObjectProperty<Toggle> в вашей модели, вы не можете установить двунаправленную привязку, так как ToggleGroup.selectedToggle только для чтения.Необходимо обойти эту проблему, добавив прослушиватель как к свойству ToggleGroup.selectedToggle, так и к свойству модели, и обновите свойство, отличное от источника изменения при изменении.

Используйте Map<String, Toggle> для преобразованиятекст для переключения, который будет выбран.В следующем примере используется 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...