2015-07-21 288 views
1

當我們按下鍵盤的兩個按鍵(ctrl + here) 來放大tabview時,我想捕捉事件,這裏是我的代碼,到目前爲止我只能捕捉到ctrl,我不知道如何捕捉事件,當我們按住ctrl然後點擊+(或至少點擊ctrl然後c每次放大),我有想法的組合鍵:javafx同時捕獲多個按鍵事件

最終KeyCombination keyCtrlPlus = new KeyCodeCombination(KeyCode.PLUS,KeyCombination.CONTROL_ANY); 但我不知道如何在addEventFilter()中做到這一點。請幫忙嗎?

m_TabView.addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() { 
    @Override 
    public void handle(KeyEvent e) 
    { 
     if (keyCtrlPlus.match(e)) 
     { 
     //function to zoom tabview 
      zoomOut(e); 
     } 
    } 
}); 

回答

0

也許這可以幫助你:

this.scene.addEventHandler(KeyEvent.KEY_RELEASED, new EventHandler<KeyEvent>() { 
    @Override 
    public void handle(KeyEvent event) { 
     if(key.length()>0){ 
      if(key.toString().equals(keyCombination1)){ 
       System.out.println("Key Combination 1 pressed"); 

      }else if(key.toString().equals(keyCombination2)){ 
       System.out.println("Key Combination 2 pressed"); 
      }else if(key.toString().equals(keyCombination3)){ 
       System.out.println("Key Combination 3 pressed"); 
      } 

      key.setLength(0); 
     } 
    } 
}); 

來自

https://code.google.com/p/javafx-demos/source/browse/trunk/javafx-demos/src/main/java/com/ezest/javafx/demogallery/KeyCombinationDemo.java

+0

是的,謝謝你我改變了KEY_RELEASED的KEY_PRESSED,並且每次都檢查組合是否匹配。我發現問題是:當你點擊加號鍵時,它實際上給出的不是+ ...這就是爲什麼它不工作,我想知道是否有任何方法可以爲三個鍵組成鍵組合?我的意思是:按Ctrl + Shift + – coeur

+0

我認爲你只能添加額外的修飾符,所以Str + Shift + Alt + ... +「+」 http://download.java.net/jdk8/jfxdocs/javafx/scene/input/ KeyCodeCombination.html –

0

你可以添加一個監聽器,註冊鍵按下事件的所有按鍵放在一個bitset並在重點發布活動中評估和取消註冊。

這樣的事情,支持多種鍵,包括改性劑:

import java.util.BitSet; 

import javafx.application.Application; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.input.KeyCode; 
import javafx.scene.input.KeyEvent; 
import javafx.scene.layout.HBox; 
import javafx.stage.Stage; 

public class Main extends Application { 

    private BitSet keyboardBitSet = new BitSet(); 

    Scene scene; 
    Label label; 

    @Override 
    public void start(Stage primaryStage) { 
     HBox root = new HBox(); 

     label = new Label(); 

     root.getChildren().add(label); 

     scene = new Scene(root, 400, 400); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 

     scene.addEventFilter(KeyEvent.KEY_PRESSED, keyPressedEventHandler); 
     scene.addEventFilter(KeyEvent.KEY_RELEASED, keyReleasedEventHandler); 

     // init label text 
     updateKeyboardStatus(); 
    } 

    /** 
    * "Key Pressed" handler for all input events: register pressed key in the bitset 
    */ 
    private EventHandler<KeyEvent> keyPressedEventHandler = new EventHandler<KeyEvent>() { 
     @Override 
     public void handle(KeyEvent event) { 

      // register key down 
      keyboardBitSet.set(event.getCode().ordinal(), true); 

      updateKeyboardStatus(); 
     } 
    }; 

    /** 
    * "Key Released" handler for all input events: unregister released key in the bitset 
    */ 
    private EventHandler<KeyEvent> keyReleasedEventHandler = new EventHandler<KeyEvent>() { 
     @Override 
     public void handle(KeyEvent event) { 

      // register key up 
      keyboardBitSet.set(event.getCode().ordinal(), false); 

      updateKeyboardStatus(); 
     } 
    }; 

    /** 
    * Detect all keys and show them in the label 
    */ 
    private void updateKeyboardStatus() { 

     StringBuilder sb = new StringBuilder(); 
     sb.append("Current key combination: "); 

     int count = 0; 
     for(KeyCode keyCode: KeyCode.values()) { 

      if(keyboardBitSet.get(keyCode.ordinal())) { 

       if(count > 0) { 
        sb.append(" "); 
       } 

       sb.append(keyCode.toString()); 

       count++; 
      } 

     } 

     label.setText(sb.toString()); 

    } 

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

enter image description here

+0

@Ronald @ Stephan實際上我使用了KEY_RELEASED,並且修改了這個最終的KeyCombination的組合keyCtrlShiftPlus = new KeyCodeCombination(KeyCode.EQUALS,KeyCombination.SHIFT_ANY,KeyCombination.CONTROL_ANY);它工作正常。 – coeur

1

這是我做到了。在我看來,這有點簡單。更何況,這個特別是答案Coeur的問題;這是,如何檢查KeyCombination的addEventFilter方法的內部...

這是我的控制器類...

@FXML private TextField textField; 

final KeyCombination keyShiftTab = new KeyCodeCombination(KeyCode.TAB, KeyCombination.SHIFT_ANY); 

@FXML 
public void initialize() 
{ 
    textField.addEventFilter(KeyEvent.KEY_RELEASED, new EventHandler<KeyEvent>() 
    { 
     @Override 
     public void handle(KeyEvent e) 
     { 
      if (keyShiftTab.match(e)) 
      { 
       doSomthing(); 
       e.consume(); 
      } 
     } 
    }); 
} 

作品對我來說就像冠軍。我希望這有幫助。