- PR -

KeyMap、KeyStrokeについて

1
投稿者投稿内容
およよ
会議室デビュー日: 2004/04/03
投稿数: 9
投稿日時: 2004-04-03 19:57
皆様、宜しくお願い致します。
以前、JTextAreaについてこの掲示板で質問をさせて頂いた際に、『さくらば』様からご返答を頂きまして、正常に動作させることが出来ました。仕事の都合でちょっとそのプログラムから離れていたのですが、再度深く作りこもうと思った所、以下の部分でどうしてもわからない箇所がありました。

Keymap keymap = area.getKeymap();
keymap.addActionForKeyStroke(KeyStroke.getKeyStroke("typed \010"), new DefaultEditorKit.DefaultKeyTypedAction());

の所なのですが、これはBackSpaceを押した際のビープ音を無くすためのコードとして頂いたのですが、これを応用してEnterを押した際にもビープ音を無くそうと試みているのですが、上記の("typed \010")の所に何を指定して良いのかがわかりません。api等でgetKeyStrokeについて調べてみたり、サイトで検索などしてみたのですが、中々ヒントが見つかりません。また、見当違いかもしれませんが以下のようにも書いてみたのですが、結果は変わりません。どなたかご存知の方がいらっしゃいましたらご教授願いたいと思います。宜しくお願い致します。

keymap.addActionForKeyStroke(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), new DefaultEditorKit.DefaultKeyTypedAction());

以前の投稿:
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=8416&forum=12

[ メッセージ編集済み 編集者: およよ 編集日時 2004-04-04 14:29 ]

[ メッセージ編集済み 編集者: およよ 編集日時 2004-04-04 14:30 ]
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2004-04-04 22:58
このへんが参考になるのかな?
Java Tutrial How to Use Key Bindings
API:KeyStroke#getKeyStroke
およよ
会議室デビュー日: 2004/04/03
投稿数: 9
投稿日時: 2004-04-05 01:23
かずくん様、ありがとうございます。教えて頂いたページを調べてみます。また結果をご報告したいと思います。
さくらば
大ベテラン
会議室デビュー日: 2002/11/12
投稿数: 145
投稿日時: 2004-04-06 05:08
こんにちは、さくらばです。

気がつかなくて、すいません。

引用:

およよさんの書き込み (2004-04-03 19:57) より:

keymap.addActionForKeyStroke(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), new DefaultEditorKit.DefaultKeyTypedAction());



これであっていると思うのですが、正しく動作しませんか?

ところで、私の環境では何もしなくても Enter でビープ音が鳴らないのですが。
Win XP の J2SE 1.4.2_04 と 1.5beta1 で確かめています。

およよさんの環境はどのようになっているのでしょうか?
およよ
会議室デビュー日: 2004/04/03
投稿数: 9
投稿日時: 2004-04-06 11:05
さくらば様、ありがとうございます。
こちらの環境としましては、Win2000、JDK1.3.1.10です。
さくらば様にご指摘頂きました、

keymap.addActionForKeyStroke(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), new DefaultEditorKit.DefaultKeyTypedAction());

ですが、申し訳ありません。私の勘違いか再度、確認したところビープ音は鳴りませんでした。
ただ、以前頂きました以下のコード、

keymap.addActionForKeyStroke(KeyStroke.getKeyStroke("typed \010"), new DefaultEditorKit.DefaultKeyTypedAction());

では、Backspaceキーでビープ音は鳴らなかったのですが、「Enter」と同様に、

keymap.addActionForKeyStroke(KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, 0), new DefaultEditorKit.DefaultKeyTypedAction());

にするとビープ音が鳴ってしまいます。
また、かずくん様に教えて頂きましたサイトから以下のようなコードを参考にしてみたのですが、

コード:
area.getInputMap().put(KeyStroke.getKeyStroke("typed \010"), "doNothing");
area.getActionMap().put("doNothing", doNothing);
(中略)

	Action doNothing = new AbstractAction() {
		public void actionPerformed(ActionEvent e) {
		}
	};


だとビープ音は鳴らないのですが、「typed \010」を「BACK_SPACE」などに変えてみたらうまくいきません。
addActionForKeyStrokeのやり方では、VK_DELETEなどでもうまくいきました。
また、getInputMapの方では、
area.getInputMap().put(KeyStroke.getKeyStroke("DELETE"), "doNothing");
でも上手くいきました。
Backspaceだと何故かうまくいきません。Backspaceの書き方が間違っているのでしょうか?
わかりづらい質問で申し訳ありません。
宜しくお願い致します。
さくらば
大ベテラン
会議室デビュー日: 2002/11/12
投稿数: 145
投稿日時: 2004-04-07 05:08
こんにちは、さくらばです。

引用:

およよさんの書き込み (2004-04-06 11:05) より:
ただ、以前頂きました以下のコード、

keymap.addActionForKeyStroke(KeyStroke.getKeyStroke("typed \\10"), new DefaultEditorKit.DefaultKeyTypedAction());

では、Backspaceキーでビープ音は鳴らなかったのですが、「Enter」と同様に、

keymap.addActionForKeyStroke(KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, 0), new DefaultEditorKit.DefaultKeyTypedAction());

にするとビープ音が鳴ってしまいます。

Backspaceだと何故かうまくいきません。Backspaceの書き方が間違っているのでしょうか?



そうなんです。私もこれで困っています。
たとえば J2SE のバージョンによっても書き方が異なって、J2SE 1.4 だと上の書き方、
J2SE 1.5 だと下の書き方でないとビープ音が鳴ってしまいます。

ようするに typed \010 でとれる KeyStroke オブジェクトと VK_BACK_SPACE で
取得できる KeyStroke オブジェクトがまったく別物になっていることが問題の
ようです。

最後に添付したコードを実行すると

コード:
"typed \010"
  KeyChar: 0x8
  KeyCode: 0x8
  KeyEventType: 400
  Modifier: 0x8
  HashCode: 0x14

KeyEvent.VK_BACK_SPACE
  KeyChar: 0xffff
  KeyCode: 0xffff
  KeyEventType: 401
  Modifier: 0xffff
  HashCode: 0x120002

"typed \010" != KeyEvent.VK_BACK_SPACE



というようになってしまい。 まったく別物と扱われていることが分かると思います。
ちなみに 0xffff は CHAR_UNDEFINED、EventType の 400 が KEY_TYPED、401 が KEY_PRESSED
になっています。

それではどうすればいいかというと、結局考えられる KeyStroke を keymap にすべて登録して
しまうしかないのではないでしょうか。

コード:
import java.awt.event.KeyEvent;
import javax.swing.KeyStroke;

public class KeyStrokeTest {
    public KeyStrokeTest() {
        KeyStroke stroke1 = KeyStroke.getKeyStroke("typed \010");
        KeyStroke stroke2 = KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, 0);

        System.out.println("\"typed \\010\"");
        showStrokeInfo(stroke1);
        System.out.println("\nKeyEvent.VK_BACK_SPACE");
        showStrokeInfo(stroke2);

        if (KeyStroke.getKeyStroke("typed \010").equals(KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, 0))) {
            System.out.println("\n\"typed \\010\" == KeyEvent.VK_BACK_SPACE");
        } else {
            System.out.println("\n\"typed \\010\" != KeyEvent.VK_BACK_SPACE");
        }
    }

    private void showStrokeInfo(KeyStroke stroke) {
        System.out.println("  KeyChar: 0x" + Integer.toHexString(stroke.getKeyChar()));
        System.out.println("  KeyCode: 0x" + Integer.toHexString(stroke.getKeyChar()));
        System.out.println("  KeyEventType: " + stroke.getKeyEventType());
        System.out.println("  Modifier: 0x" + Integer.toHexString(stroke.getKeyChar()));
        System.out.println("  HashCode: 0x" + Integer.toHexString(stroke.hashCode()));
    }

    public static void main(String[] args) throws Exception {
        new KeyStrokeTest();
    }
}



およよ
会議室デビュー日: 2004/04/03
投稿数: 9
投稿日時: 2004-04-08 08:55
さくらば様、ありがとうございます。
BackspaceのKeyStrokeの取得にはそのような問題があるのですね。
さくらば様の仰るとおり、とりあえずは考えられるKeyStrokeをKeyMapに登録して作って行こうと思います。
いつも的確なご返答を頂き本当にありがとうございます。
1

スキルアップ/キャリアアップ(JOB@IT)