2016-05-28 4 views
0

以下のようにKeyEventハンドラを設定すると、動作は期待どおりで、大文字と文字または文字ではないAscii文字についてはOracleのマニュアルのようになります。小文字の不思議なKeyEvent処理

しかし、小文字の場合、文字を入力するときにCtrlキーを押したままにすると、EventHandlerはキー押しを登録できないようです。

これは、Q、q、$、Ctrl + Q、Ctrl + q、Ctrl + $を順番に入力すると、下の出力に表示されます。

誰でもこの現象を解明できますか?何か不足していますか?私は検索しましたが、この質問に対する他の参照は見つかりませんでした。

import javafx.application.*; 
import javafx.stage.*; 
import javafx.scene.*; 
import javafx.event.*; 
import javafx.scene.input.KeyEvent; 

// Test handling keypresses of upper and lower case letter, and non-alphameric ascii symbol, 
// to see if any difference exists when Ctrl is held down 
// between the handling for (ev.isShortcutDown()) and (ev.isMetaDown() || ev.isControlDown()) 
// and between the three character types 

// Program to be tested by typing, in sequence, 
//    Q q $ Ctrl+Q Ctrl+q Ctrl+$ 


public class TestHandlingKeyEvents extends Application { 

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

    public void start(Stage stage) throws Exception { 
     Scene scene = new Scene(new Group()); 
     stage.setScene(scene); 

     EventHandler<KeyEvent> handleUserTyping = ev -> { 

      String charTyped = ev.getCharacter(); 
      switch (charTyped) { 
       case "Q":    // quit 
        System.out.println("\nQ typed "); 
        if (ev.isShortcutDown()) 
         System.out.println("with Shortcut down "); 
        if (ev.isMetaDown() || ev.isControlDown()) 
         System.out.println("with Meta or Ctrl down "); 
        break;     
       case "q":    // complete reset 
        System.out.println("\nq typed "); 
        if (ev.isShortcutDown()) 
         System.out.println("with Shortcut down "); 
        if (ev.isMetaDown() || ev.isControlDown()) 
         System.out.println("with Meta or Ctrl down ");    
        break; 
       case "$":    // back to last view 
        System.out.println("\n$ typed "); 
        if (ev.isShortcutDown()) 
         System.out.println("with Shortcut down "); 
        if (ev.isMetaDown() || ev.isControlDown()) 
         System.out.println("with Meta or Ctrl down ");    
        break; 
      } 
     }; 

     scene.setOnKeyTyped(handleUserTyping); 
     stage.show(); 
    } 
} 

そして出力:

[email protected]:/java$ java TestHandlingKeyEvents 

Q typed 

q typed 

$ typed 

Q typed 
with Shortcut down 
with Meta or Ctrl down 

$ typed 
with Shortcut down 
with Meta or Ctrl down 
[email protected]:/java$ 

答えて

1

あなたが望む動作を取得するためにイベントの間違った種類を使用しています。

KeyEvent javadocのさまざまなタイプのKeyEventsを読んでください。

基本的に、KEY_TYPEDイベントではなく、KEY_PRESSEDイベントにイベントハンドラを登録できます。キー入力イベントは、基になるシステムが入力によって生成されたユニコード文字を登録するときにのみ生成されます。これは、キャプチャしようとしているキー入力シーケンスの一部ではありません。 Unicode文字の生成に必ずしも関連しない入力文字シーケンスをさらに取得するには、より低いレベルのKEY_PRESSED(またはKEY_RELEASED)イベントを使用します。

これより高いレベルのインターフェイスがあり、使用することができます。これは、アクセラレータをKeyCodeCombinationsに基づいて設定するユースケースに適しています。アクセラレータ

import javafx.application.Application; 
import javafx.collections.ObservableMap; 
import javafx.scene.*; 
import javafx.scene.input.KeyCombination; 
import javafx.stage.Stage; 

// Test handling keypresses of upper and lower case letter, 
// and non-alphameric ascii symbol.  
// Program to be tested by typing, in sequence, 
//    Ctrl+Q Ctrl+q Ctrl+$  
public class TestHandlingKeyAccelerators extends Application {  
    public void start(Stage stage) throws Exception { 
     Scene scene = new Scene(new Group()); 
     stage.setScene(scene); 

     ObservableMap<KeyCombination, Runnable> accelerators = 
       scene.getAccelerators(); 

     accelerators.put(
       KeyCombination.valueOf("Ctrl+Q"), 
       () -> System.out.println("Ctrl+q -> reset") 
     ); 
     accelerators.put(
       KeyCombination.valueOf("Ctrl+Shift+Q"), 
       () -> System.out.println("Ctrl+Q -> quit") 
     ); 
     accelerators.put(
       KeyCombination.valueOf("Ctrl+Shift+'4'"), 
       () -> System.out.println("Ctrl+$ -> back to last view") 
     ); 

     stage.show(); 
    } 

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

KeyCombination.valueO Fメソッドは、キーの組み合わせを構築するために使用される方法に注意を使用して

サンプル。また、文字を識別する '4'を除いてどのように各キーがそのキーコードによって識別されるかに注意してください。私のキーボードでは、小文字のqと大文字のQは同じキーですが、シフトは大文字のキーを生成するために使用され、Ctrl + qはCtrl + Qとしてエンコードされ、Ctrl + QはCtrl + Shift + Q.また、私のキーボードにはドルのキーはありませんが、shiftキーと4つのキーを押すとドルが生成されます。通常、4つのキーコードはDIGIT4ですが、何らかの理由で、この場合は動作しません。だからCtrl + $演算を得るには、Ctrl + Shift + '4'を使って、文字 '4'を生成するキーが押されたときのコントロールとシフト修飾子を表します。マック(2012年のMacBook Air OS X 10.11.4、Javaの8u60)でテストされ、ほとんどトリビアあるサイドノート、あなたのプログラムとしても、あなたの元のサンプル

の動作に

コメント、他のキーボードシステムやキーイベントのOS処理のために異なる出力が得られます。あなたの提案のキーシーケンスのためのMac上で出力されます:あなたは、あなたの質問に表示次の出力シーケンスは、Mac上で生産されていない

Q typed q typed $ typed 

Q typed 
with Shortcut down 
with Meta or Ctrl down 

$ typed 
with Shortcut down 
with Meta or Ctrl down 
関連する問題