0

テンキーのエンターキーにswingアプリでキーバインディングを使おうとしているのですが、キーが引っ掛かりにくいです。私が見たすべての例は、次のようなものに依存しています
key == KeyEvent.VK_KP_LEFT

ここで、VK_KP_LEFT は事前定義された値です。他のオプションは、次のようにキーストロークを定義することです。
KeyStroke.getKeyStroke("control A");
KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK);

しかし、テンキーの「修飾子」が見つかりませんでした。

簡単に取得できるのは、一般的なテンキー入力とテンキー入力の違いです。すべてのテンキー キー (数値モードで切り替えられたかどうかに関係なく) が割り当てられます
getKeyLocation() == 4
(これは、キーを押した方法とキーを離した方法から見つけました) 。

問題は
、テンキーのエンターキーの keyStroke を適切に準備して、
inputMap.put(KeyStroke keyStroke, Object actionMapKey)
キーバインドメソッドで使用するにはどうすればよいかということです。

ありがとう、
タリク

4

2 に答える 2

2

Enterバインディングキーを探している場合は、次のように使用できますKeyEvent.VK_ENTER

getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "someAction");
getActionMap().put("someAction", someAction);

以下に短い例を示します。

import java.awt.event.*;
import javax.swing.*;

public class Test {
    public static void main(String[] args) throws Exception {
        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();
        panel.add(new JLabel("Hit Enter"));

        Action someAction = new AbstractAction() {
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(frame, "Got it");
            }
        };

        panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
                KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "someAction");
        panel.getActionMap().put("someAction", someAction);

        frame.add(panel);

        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

編集:テンキーとメインキーボードの VK_ENTER

いくつかのテストの後、これらのキーを個別にバインドすることはできないようです。KeyStroke両方のキーに対して同じものが生成されます。の実装はJComponent.processKeyBindingを検査しません。目的のアクションを見つけることだけがKeyEvent重要です。KeyStroke

SwingUtilities.notifyAction実際のアクションのディスパッチを担当するものは、すべての詳細を委任するわけではありませんKeyEvent(キー、修飾子、および when のみ)。に詳細がないため、アクション内でどちらかを区別する方法はありませんActionEvent

手間をかける価値がある場合はprocessKeyBinding、必要に応じてロジックをオーバーライドして追加できます。KeyboardFocusManageraddKeyEventDispatcher()キーの 1 つをブロックするためにも使用できます。

于 2013-04-17T20:31:29.157 に答える
-1

これはどう?

if(keyEvent.getKeyLocation() == KeyEvent.KEY_LOCATION_NUMPAD 
&& keyEvent.getKeyCode() == KeyEvent.VK_ENTER)
于 2013-04-17T20:40:56.167 に答える