当前位置: 首页 > 知识库问答 >
问题:

JavaFX:同时处理组合键和鼠标事件

有骏祥
2023-03-14

我需要对按键-鼠标事件组合做出反应,如:

CtrlShiftRleft_mousebutton_clicked

但是我不知道,只有在按住Ctrl键和Shift键的组合出现时,如何处理“左键单击”的问题。

像这样的解决方案

if(MouseEvent.isControlDown())

不会工作,因为可能有不同的组合键和任何种类的字母。

有什么想法吗?

共有2个答案

薛楷
2023-03-14

ctrl和shift都可以按照您在那里的方法进行。鼠标左键是PrimaryButton

if(mouseEvent.isControlDown() && mouseEvent.isShiftDown && mouseEvent.isPrimaryKeyDown){
    // Do your stuff here
}

对于“非特殊”键(如r)I thnk,您需要为其创建一个全局布尔值和一个单独的keyevent侦听器。因此:

boolean rIsDown = false;

scene.setOnKeyPressed(e -> {
if(e.getCode() == KeyCode.R){
    System.out.println("r was pressed");
    //set your global boolean "rIsDown" to true
}
});

scene.setOnKeyReleased(e -> {
if(e.getCode() == KeyCode.R){
    System.out.println("r was released");
    //set it rIsDown back to false
}
});

然后将您的it与其他条件一起使用。。。

    if(mouseEvent.isControlDown() && mouseEvent.isShiftDown && rIsDown &&  mouseEvent.isPrimaryKeyDown){
    // Do your stuff here
}
卫志泽
2023-03-14

您可以使用容器来存储当前按下的键:

private final Set<KeyCode> pressedKeys = new HashSet<>();

您可以通过鼠标单击将侦听器附加到要作为目标的控件的场景

scene.setOnKeyPressed(e -> pressedKeys.add(e.getCode()));
scene.setOnKeyReleased(e -> pressedKeys.remove(e.getCode()));

当这些侦听器维护集合时,您可以简单地在目标节点上附加一个侦听器:

Label targetLabel = new Label("Target Label");
targetLabel.setOnMouseClicked(e -> {
    if (e.getButton() == MouseButton.PRIMARY &&
        pressedKeys.contains(KeyCode.R) && 
        e.isShortcutDown() &&
        e.isShiftDown()) 

        System.out.println("handled!");
});

示例应用程序

public class MouseClickExample extends Application {

    private final Set<KeyCode> pressedKeys = new HashSet<>();

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

    @Override public void start(Stage stage) {
        VBox root = new VBox();
        Scene scene = new Scene(root, 450, 250);

        scene.setOnKeyPressed(e -> pressedKeys.add(e.getCode()));
        scene.setOnKeyReleased(e -> pressedKeys.remove(e.getCode()));

        Label targetLabel = new Label("Target Label");
        targetLabel.setOnMouseClicked(e -> {
            if (e.getButton() == MouseButton.PRIMARY && pressedKeys.contains(KeyCode.R) && e.isShortcutDown() && e.isShiftDown())
                System.out.println("handled!");
        });

        root.getChildren().add(targetLabel);
        stage.setScene(scene);
        stage.show();
    }
}

注意:元键也存储在集合中,但本例不使用元键。也可以在集合中检查元键,而不是在鼠标事件上使用方法。

 类似资料:
  • 目标 学习在OpenCV中处理鼠标事件 你将学习这些函数:cv2.setMouseCallback() 简单的演示 在这里,我们创建一个简单的应用程序,无论我们在哪里双击它,都会在图像上绘制一个圆圈。 首先我们创建一个鼠标事件发生时执行的回调函数。鼠标事件可以是任何与鼠标有关的东西,例如左键,左键,左键双击等。它给我们每个鼠标事件的坐标(x,y)。有了这个活动和地点,我们可以做任何我们喜欢的事情。

  • 我有一个JavaFX应用程序,我想为场景中任何地方的鼠标单击添加一个事件处理程序。下面的方法可以工作,但不完全按照我想要的方式。这里有一个例子来说明问题: 如果单击空空间中的任何位置,将调用方法,但如果单击,则不会调用方法。在我的应用程序中有许多按钮和其他交互元素,因此我需要一种方法来捕获对这些元素的点击,而不必为每个元素手动添加新的处理程序。

  • 我正在构建一个Java应用程序。这个应用程序是一个典型的“油漆”应用程序,你可以选择一种颜色,并在画布上绘制。除了...我将有一个圆圈数组分布在画布的顶部。我希望这些圆立即改变颜色,如果,当用户正在绘制和鼠标得到圆的X(10)个像素(其中X是绘制的线的宽度除以2)。 这是我的密码。我有一张画布是一组的一部分。我还创建了一个圆圈节点,并将其作为组的一部分。我想我需要以某种方式创建一个鼠标事件,当用户

  • 如何在JavaFX中为快捷键添加功能键(即F1到F12键)?我用保存按钮。我不需要点击保存按钮,它使系统变得容易

  • 导语 事件是对各种应用程序需要知道的由应用程序内部或者外部产生的事情或者动作的通称。对于初学者,总会对Qt中信号和事件的概念混淆不清。其实,记住事件比信号更底层就可以了。比如说,我们用鼠标按下界面上的一个按钮,它会发射clicked()单击信号,但是,它怎么知道自己被按下的呢,那就是通过鼠标事件处理的。这里可以看到,鼠标事件比信号更底层。 在Qt中处理事件有多种方法,不过最常用的是重写Qt事件处理

  • 我是javafx新手,目前正在做菜单,menuitems。我希望覆盖显示上下文菜单的默认事件,即使菜单没有被按下,但鼠标悬停在它上面,而相邻菜单的上下文菜单显示时,当前仍会显示。这发生在每个应用程序中,因为它非常方便。但由于某种原因,我不需要它。我试图捕获菜单上的鼠标事件,这样我就可以相应地工作,但什么也没发生。 这里是我想要添加此行为的菜单。