既存の答えを見つける適切な方法が見つからないため、私の状況を説明するスケッチの例を次に示します。
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メソッドがバックグラウンドで永続的に実行されているかどうかは疑わしいです。
OK、みんな、kleopatraのリクエストに従って、実行できる簡単なサンプルを作成しました。
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(true);
外部で実行されます(この場合はButtonアクションハンドラーから)。したがって、RadioButtonイベントハンドラーを無効にしてから再度有効にする必要はありません。
RadioButtonが本当に選択されるようにするためのRadioButtonイベントハンドラー内のsetSelected(true)の必要性に関して、直接RadioButtonの状態変更をインターセプトできるバックラウンドプロセスがあるかどうかは、残りのコードに依存します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加