3

如果按下 CTRL 或 SHIFT 之类的修饰键,JavaFX 不会执行诸如ActionEventforButton或之类的事件。CheckBox据我了解,这种行为是在其中实现的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,则应在模型中设置一个称为“锁定”或“保护”的附加标志,这将防止状态可以被被应用程序的一些其他逻辑覆盖。

这应该对用例有所了解,但如果不是,这对我的实际问题并不重要:即使用户按下修饰符,我如何才能使 aCheckBox仍然可以切换(或被按下)Button钥匙?

谢谢你的帮助!

4

1 回答 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); }

}

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
于 2019-01-14T16:39:39.600 回答