Должен ли я предотвратить цикл действия обработчика вызова - PullRequest
0 голосов
/ 27 августа 2018

Не могу найти правильный способ найти существующие ответы, поэтому вот пример эскиза, описывающий мою ситуацию:

public class MyRButton {
    RadioButton rb;
    MyRButton (RadioButton _rb) {
         rb = new RadioButton(_rb);
         rb.setOnAction(this::handleSelectedAction);
    }

    handleSelectedAction(ActionEvent _selected) {
        // DO if RadioButton rb is selected directly (by mouse etc.)
        // Some external actions are able to reset isSelected() state of the 
        // RadioButton during action handling, so to make sure it's still
        // selected after method processing:
        rb.setSelected(true);   // HERE IS THE DOUBT IF THIS OPERATOR CALLS
        // handleSelectedAction(ActionEvent _selected) RECURSIVELY     
    }
}

Должен ли я окружить rb.setSelected (true) инструкцией обработчика отключения / включения?

    handleSelectedAction(ActionEvent _selected) {
        // DO if RadioButton rb is selected directly (by mouse etc.)
        rb.setOnAction(null);
        rb.setSelected(true);
        rb.setOnAction(this::handleSelectedAction);
    }

Оригинальный код работает хорошо, но я подозреваю, что метод handleSelectedAction постоянно работает в фоновом режиме.

1 Ответ

0 голосов
/ 27 августа 2018

Хорошо, ребята, согласно запросу Клеопатры, я составил короткий пример, который можно запустить:

    package rbexample;

    import javafx.application.Application;
    import javafx.event.ActionEvent;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.control.RadioButton;
    import javafx.scene.layout.VBox;
    import javafx.stage.Stage;

    public class RBExample extends Application {
        RadioButton rBtn;
        Button btn;

    @Override
    public void start(Stage primaryStage) {
        rBtn = new RadioButton();
        rBtn.setText("Select Me");
        rBtn.setOnAction(this::handleRBSelectedAction);
        btn = new Button();
        btn.setText("Push Me");
        btn.setOnAction(this::handleBPushedAction);

        VBox root = new VBox(2);
        root.getChildren().add(rBtn);
        root.getChildren().add(btn);
        Scene scene = new Scene(root, 150, 50);
        primaryStage.setTitle("RBExample");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private void handleRBSelectedAction(ActionEvent event) {
        if (rBtn.isSelected()) {
            System.out.println("RB Selected directly");
        }
    }
    private void handleBPushedAction(ActionEvent event) {
        rBtn.setSelected(true);
        System.out.println("RB Selected by button");
    }

    public static void main(String[] args) {
        launch(args);
    }
}

Как видно из этого примера, обработчик события RadioButton не вызывается, если действие

rBtn.setSelected (истина);

выполняется извне (в данном случае из обработчика действий кнопки). Поэтому нам не нужно отключать и повторно включать обработчик событий RadioButton.

Относительно необходимости использования setSelected (true) внутри обработчика событий RadioButton, чтобы гарантировать, что RadioButton действительно выбран, зависит от остальной части кода, если есть какие-то фоновые процессы, которые могут перехватывать прямое изменение состояния RadioButton.

...