[Java] 16 October 2006 はてなブックマーク - Shiftキー押下時の振る舞いを実装するには Twitterでつぶやく

Shiftキー押下時の振る舞いを実装するには

Swingのメモ。
任意のJComponentにおいてShiftキー押下、解放時の振る舞いを実装しようと思った。
↑ターゲットとしては、業務アプリとかで画面下部に並んでいるファンクションボタン、アレってShiftキーだけ押下するとラベルが変わったりするでしょう?(例えば秀丸とかもそうだけど・・・)

あの動作をコンポーネント化した状態で実装したかった。
作り込みならKeyEventを拾って一個一個ハンドリングすればよいけど、再利用可能なコンポーネント化をしたいとき余りにも問題があると思ったので、InputMapにShiftのKeyBindを追加する。
FunctionKeyの振る舞い自体はMnemonic(ニーモニック)で対応予定。

//インプットマップの取得
InputMap inputMap
= getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
//アクションマップの取得
ActionMap actionMap = getActionMap();

//Shiftが押下されたときのKeyStrokeを取得
KeyStroke shiftPressKeyStroke
= KeyStroke.getKeyStroke(
KeyEvent.VK_SHIFT,
InputEvent.SHIFT_MASK,
false);

//文字表現によるKeyStroke
//KeyStroke shiftDownKeyStroke
// = KeyStroke.getKeyStroke("shift pressed SHIFT");

//KeyStrokeの登録
inputMap.put(shiftPressKeyStroke,"press");
//対応するActionの登録(shiftPressedはAction)
actionMap.put("press",shiftPressed);

//Shiftが押下状態から開放されたときのKeyStrokeを取得
KeyStroke shiftReleaseKeyStroke
= KeyStroke.getKeyStroke(KeyEvent.VK_SHIFT,0,true);

//文字表現によるKeyStroke
//KeyStroke shiftReleaseKeyStroke
// = KeyStroke.getKeyStroke("released SHIFT");

//KeyStrokeの登録
inputMap.put(shiftReleaseKeyStroke,"release");
//対応するActionの登録(shiftReleasedはAction)
actionMap.put("release",shiftReleased);


重要なのは、InputMap取得時に
getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
すること、デフォルトだとWHEN_FOCUSEDなのでどこでもハンドリングされるわけではない。

謎なのは、Shiftキーのpressを拾うときにmodifiersにSHIFTのマスクを設定する必要があること・・・。

参考:
JComponentのJavaDoc
InputMapのJavaDoc
The Java™ Tutorials > Creating a GUI with JFC/Swing > Using Other Swing Features
How to Use Key Bindings

http://www.javadrive.jp/tutorial/jmenu/index10.html

これはEventListnerを利用する方法、これをやりたくなかったからInputMapを利用した。
http://www.atmarkit.co.jp/fjava/javatips/112java018.html


Comments

Cランチ wrote:

あー、昔、似たようなことやってたような記憶があります。
多分、俺もイベントリスナーを利用する方法で実装したくなかったので、そんなことをやってたんだと思います。
でももう詳しいことは忘れちゃいましたw・・・orz

17 October 2006 at 00:40

Add Comment

このアイテムは閲覧専用です。コメントの投稿、投票はできません。