2017-04-05 38 views
1

我需要在像键+鼠标事件组合反应:JavaFX的:处理组合键和鼠标事件同时

Ctrl键 + + - [R + left_mousebutton_clicked

但是我不能不知道如何处理“left_mousebutton_clicked”只有当组合键Ctrl + Shift + R发生。

if(MouseEvent.isControlDown()) 

一个解决方案将无法正常工作的原因有可能是任何种类的字母不同的组合键。

任何想法?

回答

3

您可以使用一个容器来存储当前按键:

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

您可以将监听到你想要的目标控制的Scene鼠标点击:

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

虽然这些听众保持该集合,但您可以简单地在目标上附加听众:Node

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

Application

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

注:元密钥也存储在Set但它们不使用这个例子。也可以在集合中检查元键,而不是使用鼠标事件上的方法。

+0

非常感谢您的帮助!我想过一个类似的解决方案来存储一个布尔值,如果所有需要的键都被处理,并将其与mouseclick事件进行比较。但我认为有一个本地(内置)javafx函数,特别是对于快捷键+ mouseevents。但无论如何,你用'set'的方式看起来非常优雅。 – Rabbitz

0

ctrl和shift都可以按照您在那里访问的方式完成。鼠标左键是PrimaryButton

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

,并为“非特殊”键(如R)我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 
} 
}); 

然后用你它连同其他条件......

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