- PR -

SWTのTextModifyListenerで、以下の様な動きを実現したいのですが可能でしょうか?

1
投稿者投稿内容
tak
会議室デビュー日: 2005/07/06
投稿数: 12
お住まい・勤務地: Tokyo
投稿日時: 2005-12-12 21:13
SWTのリスナーには、テキストが編集されたのを感知するTextModifyListenerがありますが、
このリスナーは一文字でも、入力、削除するとその度にイベントが発生します。
これを連続で入力、削除が行われた場合は、最後のイベントだけを感知する様にしたいのですが、
この様な動きは実現できないでしょうか?

ウィジェットの選択の変更のリスナーでは、
appPostSelectionChangedListenerの様に連続で発生したイベントに関しては感知せず、
最後のイベントのみを受け取るリスナーはあるのですが、テキストの編集に関しては、その様なものは見当たりません。

ちょっとした案でもかまいませんので、リスナー内部の実装等で上記の様な動きを実現できるような方法はありますでしょうか?
#用途としましては、テキストが入力されると同時に検索する様な機能を考えています。
ちいにぃ
大ベテラン
会議室デビュー日: 2002/05/28
投稿数: 244
投稿日時: 2005-12-13 15:33
引用:
これを連続で入力、削除が行われた場合は、最後のイベントだけを感知する様にしたいのですが、



「連続で入力」の条件が難しいですね。
たとえば、
操作の間隔が0.5秒以内なら連続と判断とか、
他のコントロールにフォーカスを移さない間は連続と判断するとか。

自前でやる場合、イベントの発生時刻が必要になりそうです。
この点はイベント自体のタイムスタンプが使えそうです。
org.eclipse.swt.widgets.Event#time (the time that event occured)

ただ、単位がわからないのが難点。そこで、実測してみました。

Example plug-ins (SWTのComboのテキストが変更されたイベントを参照) を使い、TraverseEventだけを表示、キーを押しっぱなしにしてみました。Windows XP SP1, Eclipse 3.1.1を使用。

Traverse [31]: TraverseEvent{Text {} time=3895421 data=null character='\\\\\\\\0' keyCode=16777219 stateMask=0 doit=false detail=32}
Traverse [31]: TraverseEvent{Text {} time=3895453 data=null character='\\\\\\\\0' keyCode=16777219 stateMask=0 doit=false detail=32}
Traverse [31]: TraverseEvent{Text {} time=3895484 data=null character='\\\\\\\\0' keyCode=16777219 stateMask=0 doit=false detail=32}
Traverse [31]: TraverseEvent{Text {} time=3895515 data=null character='\\\\\\\\0' keyCode=16777219 stateMask=0 doit=false detail=32}

3895453 - 3895421 = 32
3895484 - 3895453 = 31
3895515 - 3895484 = 31

このPCのキーリピートは1/30秒 (約33.3ミリ秒) だと思いますので、timeはミリ秒単位のようです。
ただし、LinuxやMacOSXは異なるかもしれません(APIに書かれていないので、単位がミリ秒とは限らない)。
1

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