- PR -

JScrollPaneのキーボードによるスクロールだけを無効にしたい

1
投稿者投稿内容
みけ
会議室デビュー日: 2002/07/25
投稿数: 14
投稿日時: 2004-03-19 11:56
JScrollPaneの使用方法について質問なのですが
標準だとキーボードの方向キーを押すことで、上下左右にビューがスクロールします。
これを無効にする方法をご存じの方がいらっしゃいましたら教えてください。
ただし、無効にしたいのはキーボードによるスクロールだけで、マウスやホイールはそのまま使いたいのです。

どうぞよろしくお願いします。
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2004-03-19 13:28
こんにちはWataです。
JScrollPaneのprocessKeyBindingメソッドをオーバーライドすればできるようです。
詳しくは、JScrollPane使用上の留意点についておしえてください。のスレッドを読んでみてください。
Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 2004-03-19 13:38
Swing そのものは全然詳しくないのですが、解決のヒントになればと思い回答いたします。

JScrollPane はスーパークラス JComponent から getInputMap() と getActionMap() というメソッドを継承しています。(他にも膨大な数の継承メソッドがあり、どれがキー入力に関係するかを洗い出すのだけでも一苦労ですが
地道に API ドキュメントを読む努力も必要です。)

getInputMap() でどういう入力を受け付けるかがわかり、その結果何が起きるかということが getActionMap() の返値として表されています。
getInputMap() の型は javax.swing.InputMap クラスで、このクラスの remove() メソッドで方向キーを受け付けないようにしてやれば、お望みの状態になると思います。

これから先はご自身で調査・検証してみてください。
参考になれば幸いです。
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2004-03-19 14:05
コード:

JScrollPane pane = new JScrollPane();
InputMap m = pane.getHorizontalScrollBar().getInputMap();
while(m.getParent()!=null){
 m = m.getParent();
 m.clear();
}


InputMapの要素を全部消したら、反応しなくなりますよ。

[追記]
余りにも不親切だと思いましたので、追記します。

Swingは、JDK1.3以降キーバインディングの管理方法が変更になりました。

JComponentは、ユーザの入力に応じてディスパッチされる処理の管理を、ActionMapInputMapという2つのマップで管理しています。
ActionMapというのは、簡単にいえば、"動作の内容を表現する文字列"をキーとし、Action(ActionListener)のサブクラスオブジェクトを値とするマップ、InputMapというのは、KeyStrokeをキー、ActionMapの"動作の内容を表現する文字列"を値とするマップです。

ユーザがキーボードの操作を行うと、現在フォーカスが当たっているJComponentのInputMapからキー入力に対応する文字列をサーチ→文字列に対応する処理をActionMapからサーチ、という流れでActionにディスパッチされます。

InputMapは階層構造になっていて、そのJComponent固有のInputMapに要素が見つからない場合、親のInputMapを見に行くという実装になっています。ですので、キー入力に対応する動作を変えたい場合は、親まで含めて全て消去するか、そのJComponent固有のInputMapに対して対応する要素を全てaddし、親InputMapの動作を遮蔽してしまう(クラスをオーバーライドすることがイメージとしては近いでしょうか)必要があります。

[ メッセージ編集済み 編集者: シュン 編集日時 2004-03-22 11:09 ]
1

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