#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());
}
});