JavaFX鼠标交互的事件不会触发,如果按下了键。

3

如果按下类似CTRL或SHIFT这样的修改键,JavaFX将不会执行像ButtonCheckBoxActionEvent等事件。就我所知,这种行为是在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,那么模型中将设置一个名为“锁定”或“保护”的额外标志,这将防止应用程序的其他逻辑覆盖该状态。
这应该给出了一个关于用例的想法,但如果没有也不要紧,因为这并不是我的实际问题:如何使一个复选框仍然可以切换(或者按下一个按钮)即使用户按下修饰键?
谢谢您的帮助!
1个回答

2
这很奇怪,你可以像这样自己实现:

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

}

复选框的输出:
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

好的,谢谢。这正是我自己想到的解决方案。这意味着我们需要重新实现复选框的点击行为。也许你有一些聪明的想法,如何重用默认处理程序?否则,我们还必须考虑“不确定”状态,即如果allowIndeterminate为真。 - Till F.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接