Позвольте пользователю определить сочетание клавиш - PullRequest
2 голосов
/ 07 мая 2019

Чтобы упростить использование моего приложения JavaFx, я хочу позволить пользователю определить комбинацию клавиш / комбинацию клавиш для запуска наиболее важных действий приложения.

Я знаю, как определить KeyCodeCombination в коде и установить его как Accelerator или использовать его в слушателе KeyEvent, но вместо того, чтобы жестко его кодировать, я бы хотел, чтобы пользователь мог определить свой собственный KeyCodeCombination просто нажатие на клавиатуру в определенном диалоге настроек.

В основном что-то в этом псевдокоде:

// how would I implement the next two lines
Dialog dialog = new KeyboardShortcutDefinitionDialog();
KeyCombination shortcut = dialog.recordKeyboardShortcut();

// I know how to do the rest from here
shortcutLabel.setText(shortcut.toString());
SettingsManager.storeShortcut(shortcut);
Application.setupShortcut(shortcut);

1 Ответ

2 голосов
/ 15 мая 2019

Вот небольшой пример прослушивания события KEY_PRESSED и построения из него KeyCombination.

import java.util.ArrayList;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.input.KeyCodeCombination;
import javafx.scene.input.KeyCombination;
import javafx.scene.input.KeyCombination.Modifier;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.StackPane;
import javafx.scene.text.Font;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
        var label = new Label();
        label.setFont(Font.font("Segoe UI", 15));
        primaryStage.addEventHandler(KeyEvent.KEY_PRESSED, event -> {
            if (!event.getCode().isModifierKey()) {
                label.setText(createCombo(event).getDisplayText());
            }
        });

        primaryStage.setScene(new Scene(new StackPane(label), 500, 300));
        primaryStage.setResizable(false);
        primaryStage.show();
    }

    private KeyCombination createCombo(KeyEvent event) {
        var modifiers = new ArrayList<Modifier>();
        if (event.isControlDown()) {
            modifiers.add(KeyCombination.CONTROL_DOWN);
        }
        if (event.isMetaDown()) {
            modifiers.add(KeyCombination.META_DOWN);
        }
        if (event.isAltDown()) {
            modifiers.add(KeyCombination.ALT_DOWN);
        }
        if (event.isShiftDown()) {
            modifiers.add(KeyCombination.SHIFT_DOWN);
        }
        return new KeyCodeCombination(event.getCode(), modifiers.toArray(Modifier[]::new));
    }

}
...