- PR -

Swing での項目遷移時の動き

1
投稿者投稿内容
ボア
ベテラン
会議室デビュー日: 2002/05/22
投稿数: 78
投稿日時: 2003-10-19 23:50
お世話になります。

Swing でテキストフィールドにフォーカスしたときの動きを
Windows と同様にする方法について詰まっています。

通常のWindowsアプリでは、[TAB]でテキストに遷移すると、
現在入力されている値が選択状態になり、マウスを使って
テキストに遷移すると、選択状態にはなりません。
これと同じ動きを Swing で実装するにはどうすればよいでしょうか。

FocusListener で selectAll() するとマウス遷移時にも
全て選択されてしまいますし、これと同時に MouseListener
も add しても selectAll() が動いてしまいます。
またこの場合、すでに入力されている文字列の真中あたりをマウスで
クリックした時に、ここにカーソルを持ってくる方法がわかりません。

どなたかご教示お願いします。
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2003-10-20 11:11
引用:

通常のWindowsアプリでは、[TAB]でテキストに遷移すると、
現在入力されている値が選択状態になり、マウスを使って
テキストに遷移すると、選択状態にはなりません。
これと同じ動きを Swing で実装するにはどうすればよいでしょうか。


<TAB>キーの入力を、フォーカスの移動のみしか使用しないのであれば、KeyListener#keyPressedで監視すればできそうな気がする。

引用:

すでに入力されている文字列の真中あたりをマウスで
クリックした時に、ここにカーソルを持ってくる方法がわかりません。


Caretの監視はCaretListenerで行う事ができます。

詳細は、API referenceなどで、確認してください

ボア
ベテラン
会議室デビュー日: 2002/05/22
投稿数: 78
投稿日時: 2003-10-20 20:43
回答ありがとうございます。

引用:

<TAB>キーの入力を、フォーカスの移動のみしか使用しないのであれば、KeyListener#keyPressedで監視すればできそうな気がする。



これは、全てのテキスト項目に KeyListener を Add するということ
でしょうか?
話がずれますが、フォーカスの場所にかかわらず特定のキーを
リスニングするようにするにはどうすればよいでしょう?
例えば、フォーカスがどこにあっても [F12] が押されたら
ウィンドウをクローズするとか。

引用:

Caretの監視はCaretListenerで行う事ができます。
詳細は、API referenceなどで、確認してください



うーん、これしかないですかねぇ。
FocusListener で文字列を selectAll() させなければ、デフォルトの動作で
全く問題ないようなきがするのですが。。。

//

[ メッセージ編集済み 編集者: ボア 編集日時 2003-10-20 20:45 ]
想馬
大ベテラン
会議室デビュー日: 2003/05/29
投稿数: 245
お住まい・勤務地: 神奈川・東京
投稿日時: 2003-10-20 21:41
はじめまして、想馬といいます。

Tabキーで独自の操作をしたい場合は、JTextFieldは注意が必要です。
JTextFieldにリスナーとして、KeyAdapter等を追加してもTabキーをイベントとして取得しません。
isManagingFocus、processKeyEventをオーバーライドしたJTextFieldクラスを作成する必要があります。
syo
常連さん
会議室デビュー日: 2003/08/17
投稿数: 43
投稿日時: 2003-10-20 22:40
お世話になっております。

引用:

話がずれますが、フォーカスの場所にかかわらず特定のキーを
リスニングするようにするにはどうすればよいでしょう?
例えば、フォーカスがどこにあっても [F12] が押されたら
ウィンドウをクローズするとか。



javax.swing.FocusManagerなんてのはいかがでしょうか?
って、JDK1.4からはjava.awt.KeyboardFocusManagerになるんですね。

普段使っているのが、いまだに1.2.2なのでKeyboardFocusManagerは
使用したことがありませんが、
FocusManager#processKeyEvent(Component,KeyEvent)を使用して
ファンクションキー押下→対応するActionPerformed発動
というような処理を使用したことがあります。
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2003-10-21 15:43
引用:

Tabキーで独自の操作をしたい場合は、JTextFieldは注意が必要です。
JTextFieldにリスナーとして、KeyAdapter等を追加してもTabキーをイベントとして取得しません。
isManagingFocus、processKeyEventをオーバーライドしたJTextFieldクラスを作成する必要があります。


これは知りませんでした。この当たりのややこしさがswingの理解を阻害しているような気がします。

引用:

javax.swing.FocusManagerなんてのはいかがでしょうか?


なんだかややこしそうな実装だったので敬遠していたのですが、API ref.を眺めていて、java.awt.KeyEventDispatcherを登録する事で、処理を委譲できるとのことなので、試しに実装してみました。

コード:

// どこか適当なstaticフィールドで実装
static {
// JTextFieldに対するKeybord focus時の挙動を指定する。
java.awt.KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(
new java.awt.KeyEventDispatcher() {
public boolean dispatchKeyEvent(java.awt.event.KeyEvent inEvent) {
if (inEvent.getKeyCode() != java.awt.event.KeyEvent.VK_TAB) return false;

java.awt.KeyboardFocusManager aManager =
java.awt.KeyboardFocusManager.getCurrentKeyboardFocusManager();

// if (aManager.getFocusOwner() instanceof JTextField) {
if (aManager.dispatchKeyEvent(inEvent)) {
Component aFocusedOwner = aManager.getFocusOwner();

if (aFocusedOwner instanceof JTextField) {
JTextField aField = (JTextField)aFocusedOwner;
aField.selectAll();
}

return true;
}
// }

return false;
}
}
);
}


Tabキーによるfocus traverseのみ全選択するようになりました。
ただし、syoさんがおっしゃっているようにjava.awt.KeybordFocusManagerがj2se1.4以降であること、及び、すべてのJTextFieldが同挙動になることに注意する必要があります。

なかなか勉強になるスレッドでした。

# 修正:提示したコードにおいて、外側のinstanceofチェックは不要なのでcomment outした

# 追加:
KeybordFocusManager.dispatchKeyEvent()は常にtureを返すので、返り値のチェックは多分いらないです。

[ メッセージ編集済み 編集者: かずくん 編集日時 2003-10-21 16:06 ]

[ メッセージ編集済み 編集者: かずくん 編集日時 2003-10-21 16:17 ]
1

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