如果按下键,则不会触发鼠标交互的 JavaFX 事件
JavaFX Events for Mouse Interactions are not triggered if Key is pressed
JavaFX 不会为 Button
或 CheckBox
执行类似 ActionEvent
的事件,如果按下修饰键(如 CTRL 或 SHIFT)。据我了解,此行为是在 ButtonBehavior
中实现的(例如,请注意 class 中以下方法中的表达式 ! 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();
}
}
首先,我不太明白这是为什么。如果按下某个键则不触发按钮的目的是什么?
这是我的用例:我想实现一个可以 checked/unchecked 正常显示的复选框。它将切换模型中的某些状态。但它应该有一个附加功能:如果用户在使用鼠标 checking/unchecking 的同时按下某些键,如 CTRL,则应在模型中设置一个名为 "locked" 或 "protected" 的附加标志,它将防止状态被应用程序的其他逻辑覆盖。
这应该给出有关用例的想法,但如果不是,那对我的实际问题并不重要:我怎样才能使 CheckBox
仍然可以切换(或Button
被按下)即使用户按下修饰键?
感谢您的帮助!
这很奇怪,你可以像这样自己实现它
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
JavaFX 不会为 Button
或 CheckBox
执行类似 ActionEvent
的事件,如果按下修饰键(如 CTRL 或 SHIFT)。据我了解,此行为是在 ButtonBehavior
中实现的(例如,请注意 class 中以下方法中的表达式 ! 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();
}
}
首先,我不太明白这是为什么。如果按下某个键则不触发按钮的目的是什么?
这是我的用例:我想实现一个可以 checked/unchecked 正常显示的复选框。它将切换模型中的某些状态。但它应该有一个附加功能:如果用户在使用鼠标 checking/unchecking 的同时按下某些键,如 CTRL,则应在模型中设置一个名为 "locked" 或 "protected" 的附加标志,它将防止状态被应用程序的其他逻辑覆盖。
这应该给出有关用例的想法,但如果不是,那对我的实际问题并不重要:我怎样才能使 CheckBox
仍然可以切换(或Button
被按下)即使用户按下修饰键?
感谢您的帮助!
这很奇怪,你可以像这样自己实现它
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