我试图让JavaFX的助记符工作。 我有一些场景按钮,我想要实现的是通过按Ctrl + S触发此按钮的事件。 下面是一个代码sceleton:
@FXML
public Button btnFirst;
btnFirst.getScene().addMnemonic(new Mnemonic(btnFirst,
new KeyCodeCombination(KeyCode.S, KeyCombination.CONTROL_DOWN)));
巴顿的mnemonicParsing是假的。 (当然,同时努力使这项工作,我试着将它设置为true,但没有结果)。 JavaFX的文件指出,当一个助记符注册在现场,与KeyCombination到达现场未消耗,则目标节点将发送一个ActionEvent。 但是,这并不工作,也许我做错了...
我可以使用标准按钮的助记符(由mnemonicParsing设置为true和前缀“F”由下划线字母)。 不过这样一来用户必须使用Alt键,带来与菜单栏的浏览器的一些奇怪的行为(如果应用程序嵌入到网页比浏览器的菜单按Alt + S的触发按钮事件后激活)。 此外,标准的方式使得它不可能做出那样按Ctrl + Shift + F3等快捷方式。
所以,如果有一些方法,使这项工作?
为了您的使用情况下,我觉得你真的想使用加速器,而不是记忆。
button.getScene().getAccelerators().put(
new KeyCodeCombination(KeyCode.S, KeyCombination.SHORTCUT_DOWN),
new Runnable() {
@Override public void run() {
button.fire();
}
}
);
在大多数情况下,建议您使用KeyCombination.SHORTCUT_DOWN作为修改符,如上面的代码。 这方面的一个很好的解释是在KeyCombination文档:
快捷方式修改用来表示这是常用的键盘快捷键在主机平台上的修饰键。 这是在Mac上的Windows例如控制和元(命令键)。 通过使用快捷键修改开发人员可以创建独立于平台的快捷方式。 因此,“快捷键+ C”组合键在Mac的Windows“CTRL + C”和“元+ C”内部处理。
如果你想具体的代码只能处理按Ctrl + S组合键,就可以使用:
new KeyCodeCombination(KeyCode.S, KeyCombination.CONTROL_DOWN)
这里是一个可执行例如:
import javafx.animation.*;
import javafx.application.Application;
import javafx.event.*;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.image.*;
import javafx.scene.input.*;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.Duration;
public class SaveMe extends Application {
@Override public void start(final Stage stage) throws Exception {
final Label response = new Label();
final ImageView imageView = new ImageView(
new Image("http://icons.iconarchive.com/icons/gianni-polito/colobrush/128/software-emule-icon.png")
);
final Button button = new Button("Save Me", imageView);
button.setStyle("-fx-base: burlywood;");
button.setContentDisplay(ContentDisplay.TOP);
displayFlashMessageOnAction(button, response, "You have been saved!");
layoutScene(button, response, stage);
stage.show();
setSaveAccelerator(button);
}
// sets the save accelerator for a button to the Ctrl+S key combination.
private void setSaveAccelerator(final Button button) {
Scene scene = button.getScene();
if (scene == null) {
throw new IllegalArgumentException("setSaveAccelerator must be called when a button is attached to a scene");
}
scene.getAccelerators().put(
new KeyCodeCombination(KeyCode.S, KeyCombination.SHORTCUT_DOWN),
new Runnable() {
@Override public void run() {
fireButton(button);
}
}
);
}
// fires a button from code, providing visual feedback that the button is firing.
private void fireButton(final Button button) {
button.arm();
PauseTransition pt = new PauseTransition(Duration.millis(300));
pt.setOnFinished(new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent event) {
button.fire();
button.disarm();
}
});
pt.play();
}
// displays a temporary message in a label when a button is pressed,
// and gradually fades the label away after the message has been displayed.
private void displayFlashMessageOnAction(final Button button, final Label label, final String message) {
final FadeTransition ft = new FadeTransition(Duration.seconds(3), label);
ft.setInterpolator(Interpolator.EASE_BOTH);
ft.setFromValue(1);
ft.setToValue(0);
button.setOnAction(new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent event) {
label.setText(message);
label.setStyle("-fx-text-fill: forestgreen;");
ft.playFromStart();
}
});
}
private void layoutScene(final Button button, final Label response, final Stage stage) {
final VBox layout = new VBox(10);
layout.setPrefWidth(300);
layout.setAlignment(Pos.CENTER);
layout.getChildren().addAll(button, response);
layout.setStyle("-fx-background-color: cornsilk; -fx-padding: 20; -fx-font-size: 20;");
stage.setScene(new Scene(layout));
}
public static void main(String[] args) { launch(args); }
}
// icon license: (creative commons with attribution) http://creativecommons.org/licenses/by-nc-nd/3.0/
// icon artist attribution page: (eponas-deeway) http://eponas-deeway.deviantart.com/gallery/#/d1s7uih
输出示例: