2

まず第一に、これはキーロガー用ではなく、ローグライク ゲームでの入力用であり、JLabel" JFrameName: " と入力し、A-Za-z を入力できるようにしたいと考えています。キー入力の多くのオプションを見た後、KeyStrokes とActions を使い始めたところに戻りました。

私が疑問に思っているのは、これを 56 回繰り返すのではなく、キーの範囲を追加する方法があるかどうかです。

Action a = new AbstractAction() {

    public void actionPerformed(ActionEvent e) {
        // add a to string
    }
};
getInputMap().put(KeyStroke.getKeyStroke("a"), "a");
getActionMap().put("a", a);

つまり、この方法で、コピーと貼り付けを少し書くだけでそれを行うことができますが、私はそれが本当に嫌いです。使用するよりも洗練された解決策が必要です。KeyListenerこれは、どうにかしてフォーカスを合わせる必要があることを意味しますが、ウィンドウは単純JFrameに大きなJLabelものです。

また、私はJavaを数日しかやっていないので、おそらく非常に一般的に知られている解決策を見逃しているのですが、もしあれば共有してください! 感謝。

4

2 に答える 2

1

これは解決策です:

for (char c = 'a'; c <= 'z'; c++) {
    String ks = String.valueOf(c);
    getInputMap().put(KeyStroke.getKeyStroke(ks), ks);
    getActionMap().put(ks, a);
    ks = ks.toUpperCase();
    getInputMap().put(KeyStroke.getKeyStroke(ks), ks);
    getActionMap().put(ks, a);
}

JTextFieldしかし、 withを好むべきだと思いますDocumentListener

于 2012-07-03T10:07:19.843 に答える
0

JPanel各「画面」をコンテンツ ペインとして設定されたとして扱うコンテンツ マネージャ クラスを使用しています。親 JFrame への参照を基本「画面」クラスに入れ、親 JFrame に aKeyListenerを追加しました。これは、私が望むように入力をキャプチャします。KeyListenerコンテンツ ペインに誤って を追加したため、以前はこれを実行していませんでした。現在はすべて正常に動作しているようです。

public void run() {
    this.getParent().addKeyListener(new KeyListener() {

        public void keyPressed(KeyEvent e) {
            appendLabel(e.getKeyChar());
        }

        public void keyReleased(KeyEvent e) { }
        public void keyTyped(KeyEvent e) { }
    });
}

ありがとう@ミリムース!

于 2012-07-03T10:29:20.607 に答える