- - PR -
SWTのTextModifyListenerで、以下の様な動きを実現したいのですが可能でしょうか?
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-12-12 21:13
SWTのリスナーには、テキストが編集されたのを感知するTextModifyListenerがありますが、
このリスナーは一文字でも、入力、削除するとその度にイベントが発生します。 これを連続で入力、削除が行われた場合は、最後のイベントだけを感知する様にしたいのですが、 この様な動きは実現できないでしょうか? ウィジェットの選択の変更のリスナーでは、 appPostSelectionChangedListenerの様に連続で発生したイベントに関しては感知せず、 最後のイベントのみを受け取るリスナーはあるのですが、テキストの編集に関しては、その様なものは見当たりません。 ちょっとした案でもかまいませんので、リスナー内部の実装等で上記の様な動きを実現できるような方法はありますでしょうか? #用途としましては、テキストが入力されると同時に検索する様な機能を考えています。 | ||||
|
投稿日時: 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