События JavaFX для взаимодействий с мышью не запускаются при нажатии клавиши - PullRequest
0 голосов
/ 14 января 2019

JavaFX не выполняет такие события, как ActionEvent для Button или CheckBox, если нажата клавиша-модификатор, такая как CTRL или SHIFT. Насколько я понимаю, это поведение реализовано в ButtonBehavior (например, обратите внимание на выражение ! keyDown в следующем методе из этого класса):

@Override public void mouseReleased(MouseEvent e) {
    // if armed by a mouse press instead of key press, then fire!
    final ButtonBase button = getControl();
    if (! keyDown && button.isArmed()) {
        button.fire();
        button.disarm();
    }
}

Прежде всего, я не очень понимаю причину этого. Какова цель не нажимать кнопку, если нажата клавиша?

Это мой вариант использования: я хочу установить флажок, который можно установить / снять как обычно. Это переключит некоторое состояние в модели. Но у него должна быть дополнительная функция: если пользователь нажимает какую-либо клавишу, например CTRL, во время проверки / снятия галочки с помощью мыши, в модели должен быть установлен дополнительный флаг, называемый «заблокирован» или «защищен», что предотвратит возможность изменения состояния. перезаписывается другой логикой приложения.

Это должно дать представление о сценарии использования, но если нет, то для моего реального вопроса это не имеет значения: как я могу сделать возможным, чтобы CheckBox все еще можно было переключать (или Button можно нажата) хотя пользователь нажимает клавишу-модификатор?

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 14 января 2019

Странно, что вы можете реализовать это сами, например,

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        VBox vBox = new VBox();
        vBox.setAlignment(Pos.CENTER);

        CheckBox checkBox = new CheckBox();
        checkBox.setOnMouseClicked(event -> {
            if(event.isControlDown()) {
                System.out.print("Control down click ");
                checkBox.setSelected(!checkBox.isSelected());
            }
            else
                System.out.print("Normal click ");

            System.out.println("Checked Status:"+checkBox.isSelected());
        });

        Button button = new Button("Button");
        button.setOnMouseClicked(event -> {
            if(event.isControlDown())
                System.out.println("Control down click");
            else
                System.out.println("Normal click");
        });

        vBox.getChildren().addAll(new Label("Click the box"),checkBox,button);


        primaryStage.setScene(new Scene(vBox));
        primaryStage.show();
    }

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

}

Выход для CheckBox:

Normal click Checked Status:true
Normal click Checked Status:false
Control down click Checked Status:true
Control down click Checked Status:false

Выход для кнопки:

Normal click
Control down click
...