Выбор радиокнопки в группе переключения при переходе к ней с помощью клавиш со стрелками

#java #javafx #radio-button

#java #javafx #переключатель

Вопрос:

У меня есть программа с серией RadioButton ов, которые совместно используют ToggleGroup . Ниже приведена упрощенная версия:

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

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
        ToggleGroup toggleGroup = new ToggleGroup();

        RadioButton button1 = new RadioButton();
        button1.setText("Button 1");
        button1.setOnAction(this::printSelectedRadioButton);
        button1.setToggleGroup(toggleGroup);

        RadioButton button2 = new RadioButton();
        button2.setText("Button 2");
        button2.setOnAction(this::printSelectedRadioButton);
        button2.setToggleGroup(toggleGroup);

        VBox root = new VBox(10);
        root.setAlignment(Pos.CENTER);
        root.getChildren().addAll(button1, button2);

        primaryStage.setScene(new Scene(root, 100, 100));
        primaryStage.show();
    }

    private void printSelectedRadioButton(ActionEvent actionEvent) {
        RadioButton radioButton = (RadioButton) actionEvent.getSource();
        System.out.println(radioButton.getText());
    }

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

Этап, сгенерированный приведенным выше кодом

Когда я нажимаю на a, RadioButton запускается ActionEvent и printSelectedRadioButton() вызывается метод. Однако, как только я нажму на RadioButton , если я перейду к другой кнопке с помощью клавиш со стрелками, ActionEvent не запускается и метод не вызывается. Я хочу, чтобы переход к определенной кнопке имел тот же эффект, что и нажатие на нее. Как бы мне это сделать?

Комментарии:

1. @Slaw у вас есть собственный (предпочтительно Windows) пример переключения, срабатывающего при выборе? исходя из интуиции, я бы сказал, что базовое поведение, реализованное в fx, вполне корректно. Клиентский код всегда можно улучшить, чтобы сделать больше (учитывая, что запуск действия является надежной мерой)

2. выбор != действие: добавьте обычную кнопку перед группой (чтобы она изначально была сфокусирована), которая выбирает переключатель -> не срабатывать. Наоборот: обратите внимание, что поведение после щелчка мышью выполняется в два этапа (нажата -> arm, отпущена -> fire-if-armed). Чтобы увидеть, нажмите переключатель, затем выключите перед выпуском — не срабатывает.

3. @Slaw но так уж повелось с незапамятных времен (старые awt и swing, fi 🙂 Рассмотрим взаимодействие только с клавиатурой: чтобы перейти к определенному элементу управления, во время навигации мы коснемся (и, возможно, выберем, зависит от того, с чего мы начали и был ли выбран какой-либо переключатель в группе) нескольких переключателей — мы действительно хотим запускать действие для каждого (по которому мы просто перемещались, потому что это было на пути к нашей реальной цели)? Так не думаю, должно быть что-то сверху. Обычным жестом клавиатуры для запуска действия на кнопке является пробел (или ввод) при фокусировке.

4. @kleopatra имеет смысл.

Ответ №1:

RadioButton#setOnAction работает только по щелчку. Если вы хотите, чтобы переключатель был выбран, вам нужно добавить ChangeListener в группу переключения.

     ToggleGroup toggleGroup = new ToggleGroup();
    toggleGroup.selectedToggleProperty().addListener((observableValue, oldToggle, newToggle) -> {
        if (toggleGroup.getSelectedToggle() != null) {
            System.out.println("selected radio button: "   toggleGroup.getSelectedToggle());
        }
    });