Mi aspettavo che, quando uso Alt + mnemonico, il pulsante di opzione correlato diventasse attivo e selezionato. Le mie aspettative sono basate sulla mia conoscenza di come funzionano i mnemonici in Swing. Le mie aspettative sono sbagliate?Come funzionano i mnemonici con i pulsanti di scelta
Nel mio codice di esempio qui sotto ho impostato il numero di ciascun pulsante di opzione come mnemonico.
- "Opzione 1" viene selezionato all'avvio del programma.
- Quando uso Alt + 3, il programma emette un segnale acustico, tutti i mnemonici vengono sottolineati e "Opzione 3" diventa focalizzata ma NON selezionata. La GUI ora assomiglia a questo:
- Se ho appena tipo 2 ", l'opzione 2 viene messo a fuoco, ma non selezionato
Qui. è il codice:
import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.scene.image.*;
import javafx.scene.input.*;
import javafx.scene.effect.*;
import javafx.scene.paint.*;
import javafx.beans.value.*;
import javafx.geometry.*;
import javafx.event.*;
public class RadioButtonSSCCE extends Application
{
public Parent createScene()
{
ToggleGroup group = new ToggleGroup();
RadioButton rb1 = new RadioButton("Option _1");
rb1.setUserData("Option 1 selected");
rb1.setToggleGroup(group);
RadioButton rb2 = new RadioButton("Option _2");
rb2.setUserData("Option 2 selected");
rb2.setToggleGroup(group);
RadioButton rb3 = new RadioButton("Option _3");
rb3.setUserData("Option 3 selected");
rb3.setToggleGroup(group);
VBox root = new VBox(5);
root.setAlignment(Pos.CENTER);
root.getChildren().addAll(rb1, rb2, rb3);
ChangeListener<Toggle> cl = new ChangeListener<Toggle>()
{
@Override
public void changed(ObservableValue<? extends Toggle> ov, Toggle old_toggle, Toggle new_toggle)
{
if (group.getSelectedToggle() != null)
{
String text = group.getSelectedToggle().getUserData().toString();
System.out.println(text);
}
}
};
group.selectedToggleProperty().addListener(cl);
rb1.setSelected(true);
return root;
}
@Override
public void start(Stage primaryStage)
{
Scene scene = new Scene(createScene(), 125, 125);
primaryStage.setScene(scene);
primaryStage.setTitle("Radio Button SSCCE");
primaryStage.show();
}
public static void main(String[] args)
{
launch(args);
}
}
ho scoperto che per invocare mnemonico devo:
- premere e rilasciare il tasto Alt. Ora il mnemonico di ciascun pulsante di opzione è sottolineato.
- premere il numero e il pulsante di opzione diventa attivo. Tuttavia, ora ho bisogno di usare la barra spaziatrice per selezionare il pulsante di opzione.
Perché devo premere la barra spaziatrice? Il pulsante radio non deve essere selezionato quando viene premuto il mnemonico?
Inoltre, perché non posso semplicemente usare Alt + mnemonico come combinazione di un singolo tasto per selezionare un pulsante di opzione?
Il mio codice è sbagliato?
Edit:
L'azione è la chiave per la selezione del pulsante di scelta. Ho creato un'azione generica per essere condivisa da tutti i pulsanti:
EventHandler<ActionEvent> onAction = new EventHandler<ActionEvent>()
{
@Override
public void handle(ActionEvent e)
{
RadioButton button = (RadioButton)e.getSource();
button.setSelected(true);
}
};
rb1.setOnAction(onAction);
rb2.setOnAction(onAction);
rb3.setOnAction(onAction);
Dal momento che i pulsanti di opzione fanno parte di un gruppo di pulsanti non volevo la possibilità di deselezionare un pulsante.
Sei andato al lato oscuro che sembra. ;) –
Sembra che i mnemonici causino l'attivazione di eventi di azione sui pulsanti di scelta, ma in realtà non forzano la selezione a cambiare (non posso testare direttamente, perché non sembra riconoscere nulla sul mio mac come "Alt"). Questo non sembra che cambi la selezione ... potrebbe essere un bug. –
@James_D Agisce in questo modo in JavaFX 2.2 e JavaFX 8, quindi sembra essere l'intenzione. 'CheckBox' funziona allo stesso modo. – OttPrime