2017-04-15 8 views
0

現在、グリッドベースのゲームをコーディングしようとしています。 iveは、一般ナビゲーション用のキーリスナーを実装するために既に管理していました。 特定のキーを押すと、Jpopupメニューが開きます。複数のキーリストナーJava

私はキーリスナーでメニューのナビゲーションを実装したいと思います。 Bを押すとメニューが再び閉じられます。

KeyListener UnitActionMenuKeyListener = new KeyListener()   { 
    @Override 
    public void keyPressed(KeyEvent evt) 
    { 

    if (evt.getKeyCode()==KeyEvent.VK_B) 

     menu.setVisible(false) 
    } 

    @Override 
    public void keyReleased(KeyEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void keyTyped(KeyEvent arg0) { 
     // TODO Auto-generated method stub 

    JPopupMenu menu = new JPopupMenu("UnitActionMenu"); 
    JMenuItem bewegenItem = menu.add("test"); 

この後にmenu.showとmenu.addKeyListenerを使用します。

しかし、関係なく、私がしようとするもの、私の一般的なナビゲーションのいずれかが文句を言わないもう動作しない、または一般的なナビゲーションは動作しますが、私のメニューは文句を言わないB

ので、私は複数の要素に対して複数のキーリスナーを実装するのですか押しに反応? は、私はちょうど私のメインウィンドウが聴きたい(と反応する)私のメニューとは異なるいくつかのキーに

(悪い書き込みのため申し訳ありませんが、良いとイムは4時間以上の単純なタスクを失敗に不満を感じていること、私の英語イマイチ)

答えて

1

スイングキーバインディングは、一般にキーリスナーよりも優れています。主要なリスナーには、フォーカスシステムに関する問題があります。それがあなたのような問題を引き起こしています。ポップアップがアクティブになると、フォーカスが盗み出されます。フォーカスされたコンポーネントだけがキーイベントを送信します。

キーバインディングのためのチュートリアルはここにあります:https://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html

APIはもう少し複雑ですが、彼らはより堅牢だとあなたが直接フォーカス動作を指定することができます。


キーリスナーをキーバインディングに変換するためのクイックガイドです。

myComponent.addKeyListener(new KeyListener() { 
    ... 
    @Override 
    public void keyTyped(KeyEvent e) { 
     if (e.getKeyCode() == KeyEvent.VK_Z) 
      performZAction(); 
    } 
}); 

このようなものだ結合キーの書き込み:キーリスナーの

、あなたはこのようなものだいくつかのコードを持っている言い換えれば

KeyStroke keystroke = 
    KeyStroke.getKeyStroke("typed Z"); 
myComponent.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) 
    .put(keystroke, "zAction"); 
myComponent.getActionMap() 
    .put("zAction", new AbstractAction() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      performZAction(); 
     } 
    }); 

を、3つのステップがあります。

  1. KeyStroke.getKeyStrokejavax.swing.KeyStrokeオブジェクトを作成します。
  2. 入力マップを使用して、キーストロークをアクションの名前にバインドします。
  3. アクションマップを使用して、アクションの名前をjavax.swing.Actionにバインドします。

Actionはリスナーです。 javax.swing.AbstractActionを拡張することができ、それはちょうどActionListenerのようなものです。

+0

悲しいことに、私はキーバインディングの仕組みを理解していません。与えられた例はかなり複雑です。 私が使用したいメニューにはフォーカスがあり、あらかじめ定義されたキーバインディング(矢印キーでナビゲート)が機能しています。私自身のキーバインディング/リスナー(Bで辞める)は役に立ちません – qwpeo

+0

@qwpeo私の編集が助けになるかどうか確認してください。 – Radiodef