2017-04-05 58 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 
}