События JavaFX для взаимодействий с мышью не запускаются при нажатии клавиши
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 ответ
Это странно, вы можете реализовать это сами, как так
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