- PR -

InputMethodEventのソースについて

1
投稿者投稿内容
かず
会議室デビュー日: 2005/01/07
投稿数: 4
投稿日時: 2005-01-07 10:38
 日本語の入力時に処理を入れたいと思い、JTextPaneにInputMethodListenerを実装して、
作成したinputMethodTextChanged内でeventを拾っていますが、そこで問題が発生し、
お知恵を拝借したいと投稿しました。

 たとえば5文字日本語を入力し、InputMethodEventのgetCommittedCharacterCount()を利用し、
入力文字数を確認すると、5文字とカウントされて出てきますが、その後0文字数で1回
inputMethodTextChangedが走ってしまいます。

そこで、一文字だけ入力したときに取得したeventと、最後に走ったinputMethodTextChangedが
取得したInputMethodEventをevent.getSource().toString()で取得し中を見てみると
違いは、最後に走る時のeventに「invalid」が付加されているだけでした。
eventについて調査したところ、event.getSource()がJTextPaneのインスタンスでした。

長い前置きになってしまいましたが、上記で出てきた「invalid」について、
1.誰がソースに付加するのか
2.「invalid」を判断するメソッドがあるのか
3.なぜ最後に「invalid」が付加されたソースが走るのか
4.「invalid」はどういったタイミングで付加されるのか
5.そもそも、「invalid」とは何者なのか
以上の5点のことを教えていただきたいのです。

なにとぞよろしくお願いいたします。

長いですが、参考までに:
上が一文字だけ、下が最後に走ったinputMethodTextChangedが取得したeventのソースです。
test.ListenerTest[,0,0,275x100,layout=javax.swing.plaf.basic.BasicTextUI$UpdateHandler,alignmentX=null,alignmentY=null,border=javax.swing.border.LineBorder@28f6ee,flags=1200,maximumSize=,minimumSize=,preferredSize=java.awt.Dimension[width=250,height=100],caretColor=javax.swing.plaf.ColorUIResource[r=0,g=0,b=0],disabledTextColor=javax.swing.plaf.ColorUIResource[r=153,g=153,b=153],editable=true,margin=javax.swing.plaf.InsetsUIResource[top=3,left=3,bottom=3,right=3],selectedTextColor=javax.swing.plaf.ColorUIResource[r=0,g=0,b=0],selectionColor=javax.swing.plaf.ColorUIResource[r=204,g=204,b=255],kit=javax.swing.text.StyledEditorKit@6c4a87,typeHandlers=]
test.ListenerTest[,0,0,275x100,invalid,layout=javax.swing.plaf.basic.BasicTextUI$UpdateHandler,alignmentX=null,alignmentY=null,border=javax.swing.border.LineBorder@28f6ee,flags=1200,maximumSize=,minimumSize=,preferredSize=java.awt.Dimension[width=250,height=100],caretColor=javax.swing.plaf.ColorUIResource[r=0,g=0,b=0],disabledTextColor=javax.swing.plaf.ColorUIResource[r=153,g=153,b=153],editable=true,margin=javax.swing.plaf.InsetsUIResource[top=3,left=3,bottom=3,right=3],selectedTextColor=javax.swing.plaf.ColorUIResource[r=0,g=0,b=0],selectionColor=javax.swing.plaf.ColorUIResource[r=204,g=204,b=255],kit=javax.swing.text.StyledEditorKit@6c4a87,typeHandlers=]
お犬様
ベテラン
会議室デビュー日: 2003/01/26
投稿数: 67
投稿日時: 2005-01-07 21:53
期待した答えではないかもしれませんが、
1. 探してみましたが java.awt.Component が付加するみたいですね。
2.3. 4. 5. については java.awt.Component のisValid()validate()invalidate() 等を参照してください。

ちなみに、以下は jEdit4.2 final を独自改造したもので「あいうえお」を入力して確定した際のログです。
InputMethodListener の inputMethodTextChanged() および caretPositionChanged() の両方でログを出力しています。
Windows + MSIME だと確定後に 「no text」 なイベントが通知されていますが、
FreeBSD + SCIM-uim-anthy では確定後に 「no text」 なイベントは通知されていません。
引用:
Windows XP + MSIME + jdk1.5.0_01
[debug] TextAreaPainter$PaintComposedText: inputMethodTextChanged( java.awt.event.InputMethodEvent[INPUT_METHOD_TEXT_CHANGED, "" + "あ", 0 characters committed, caret: TextHitInfo[1L], visible position: TextHitInfo[1L]] on org.gjt.sp.jedit.textarea.JEditTextArea[,0,25,767x417,layout=org.gjt.sp.jedit.textarea.JEditTextArea$ScrollLayout,alignmentX=0.0,alignmentY=0.0,border=org.gjt.sp.jedit.textarea.JEditTextArea$TextAreaBorder@158689a,flags=288,maximumSize=,minimumSize=,preferredSize=] )
[debug] TextAreaPainter$PaintComposedText: caretPositionChanged( java.awt.event.InputMethodEvent[INPUT_METHOD_TEXT_CHANGED, "" + "あ", 0 characters committed, caret: TextHitInfo[1L], visible position: TextHitInfo[1L]] on org.gjt.sp.jedit.textarea.JEditTextArea[,0,25,767x417,layout=org.gjt.sp.jedit.textarea.JEditTextArea$ScrollLayout,alignmentX=0.0,alignmentY=0.0,border=org.gjt.sp.jedit.textarea.JEditTextArea$TextAreaBorder@158689a,flags=288,maximumSize=,minimumSize=,preferredSize=] )
[debug] TextAreaPainter$PaintComposedText: inputMethodTextChanged( java.awt.event.InputMethodEvent[INPUT_METHOD_TEXT_CHANGED, "" + "あい", 0 characters committed, caret: TextHitInfo[2L], visible position: TextHitInfo[2L]] on org.gjt.sp.jedit.textarea.JEditTextArea[,0,25,767x417,layout=org.gjt.sp.jedit.textarea.JEditTextArea$ScrollLayout,alignmentX=0.0,alignmentY=0.0,border=org.gjt.sp.jedit.textarea.JEditTextArea$TextAreaBorder@158689a,flags=288,maximumSize=,minimumSize=,preferredSize=] )
[debug] TextAreaPainter$PaintComposedText: caretPositionChanged( java.awt.event.InputMethodEvent[INPUT_METHOD_TEXT_CHANGED, "" + "あい", 0 characters committed, caret: TextHitInfo[2L], visible position: TextHitInfo[2L]] on org.gjt.sp.jedit.textarea.JEditTextArea[,0,25,767x417,layout=org.gjt.sp.jedit.textarea.JEditTextArea$ScrollLayout,alignmentX=0.0,alignmentY=0.0,border=org.gjt.sp.jedit.textarea.JEditTextArea$TextAreaBorder@158689a,flags=288,maximumSize=,minimumSize=,preferredSize=] )
[debug] TextAreaPainter$PaintComposedText: inputMethodTextChanged( java.awt.event.InputMethodEvent[INPUT_METHOD_TEXT_CHANGED, "" + "あいう", 0 characters committed, caret: TextHitInfo[3L], visible position: TextHitInfo[3L]] on org.gjt.sp.jedit.textarea.JEditTextArea[,0,25,767x417,layout=org.gjt.sp.jedit.textarea.JEditTextArea$ScrollLayout,alignmentX=0.0,alignmentY=0.0,border=org.gjt.sp.jedit.textarea.JEditTextArea$TextAreaBorder@158689a,flags=288,maximumSize=,minimumSize=,preferredSize=] )
[debug] TextAreaPainter$PaintComposedText: caretPositionChanged( java.awt.event.InputMethodEvent[INPUT_METHOD_TEXT_CHANGED, "" + "あいう", 0 characters committed, caret: TextHitInfo[3L], visible position: TextHitInfo[3L]] on org.gjt.sp.jedit.textarea.JEditTextArea[,0,25,767x417,layout=org.gjt.sp.jedit.textarea.JEditTextArea$ScrollLayout,alignmentX=0.0,alignmentY=0.0,border=org.gjt.sp.jedit.textarea.JEditTextArea$TextAreaBorder@158689a,flags=288,maximumSize=,minimumSize=,preferredSize=] )
[debug] TextAreaPainter$PaintComposedText: inputMethodTextChanged( java.awt.event.InputMethodEvent[INPUT_METHOD_TEXT_CHANGED, "" + "あいうえ", 0 characters committed, caret: TextHitInfo[4L], visible position: TextHitInfo[4L]] on org.gjt.sp.jedit.textarea.JEditTextArea[,0,25,767x417,layout=org.gjt.sp.jedit.textarea.JEditTextArea$ScrollLayout,alignmentX=0.0,alignmentY=0.0,border=org.gjt.sp.jedit.textarea.JEditTextArea$TextAreaBorder@158689a,flags=288,maximumSize=,minimumSize=,preferredSize=] )
[debug] TextAreaPainter$PaintComposedText: caretPositionChanged( java.awt.event.InputMethodEvent[INPUT_METHOD_TEXT_CHANGED, "" + "あいうえ", 0 characters committed, caret: TextHitInfo[4L], visible position: TextHitInfo[4L]] on org.gjt.sp.jedit.textarea.JEditTextArea[,0,25,767x417,layout=org.gjt.sp.jedit.textarea.JEditTextArea$ScrollLayout,alignmentX=0.0,alignmentY=0.0,border=org.gjt.sp.jedit.textarea.JEditTextArea$TextAreaBorder@158689a,flags=288,maximumSize=,minimumSize=,preferredSize=] )
[debug] TextAreaPainter$PaintComposedText: inputMethodTextChanged( java.awt.event.InputMethodEvent[INPUT_METHOD_TEXT_CHANGED, "" + "あいうえお", 0 characters committed, caret: TextHitInfo[5L], visible position: TextHitInfo[5L]] on org.gjt.sp.jedit.textarea.JEditTextArea[,0,25,767x417,layout=org.gjt.sp.jedit.textarea.JEditTextArea$ScrollLayout,alignmentX=0.0,alignmentY=0.0,border=org.gjt.sp.jedit.textarea.JEditTextArea$TextAreaBorder@158689a,flags=288,maximumSize=,minimumSize=,preferredSize=] )
[debug] TextAreaPainter$PaintComposedText: caretPositionChanged( java.awt.event.InputMethodEvent[INPUT_METHOD_TEXT_CHANGED, "" + "あいうえお", 0 characters committed, caret: TextHitInfo[5L], visible position: TextHitInfo[5L]] on org.gjt.sp.jedit.textarea.JEditTextArea[,0,25,767x417,layout=org.gjt.sp.jedit.textarea.JEditTextArea$ScrollLayout,alignmentX=0.0,alignmentY=0.0,border=org.gjt.sp.jedit.textarea.JEditTextArea$TextAreaBorder@158689a,flags=288,maximumSize=,minimumSize=,preferredSize=] )
[debug] TextAreaPainter$PaintComposedText: inputMethodTextChanged( java.awt.event.InputMethodEvent[INPUT_METHOD_TEXT_CHANGED, "あいうえお" + "", 5 characters committed, caret: TextHitInfo[0L], visible position: TextHitInfo[0L]] on org.gjt.sp.jedit.textarea.JEditTextArea[,0,25,767x417,layout=org.gjt.sp.jedit.textarea.JEditTextArea$ScrollLayout,alignmentX=0.0,alignmentY=0.0,border=org.gjt.sp.jedit.textarea.JEditTextArea$TextAreaBorder@158689a,flags=288,maximumSize=,minimumSize=,preferredSize=] )
[debug] TextAreaPainter$PaintComposedText: caretPositionChanged( java.awt.event.InputMethodEvent[INPUT_METHOD_TEXT_CHANGED, "あいうえお" + "", 5 characters committed, caret: TextHitInfo[0L], visible position: TextHitInfo[0L]] on org.gjt.sp.jedit.textarea.JEditTextArea[,0,25,767x417,layout=org.gjt.sp.jedit.textarea.JEditTextArea$ScrollLayout,alignmentX=0.0,alignmentY=0.0,border=org.gjt.sp.jedit.textarea.JEditTextArea$TextAreaBorder@158689a,flags=288,maximumSize=,minimumSize=,preferredSize=] )
[debug] TextAreaPainter$PaintComposedText: inputMethodTextChanged( java.awt.event.InputMethodEvent[INPUT_METHOD_TEXT_CHANGED, no text, 0 characters committed, caret: TextHitInfo[0L], visible position: TextHitInfo[0L]] on org.gjt.sp.jedit.textarea.JEditTextArea[,0,25,767x417,layout=org.gjt.sp.jedit.textarea.JEditTextArea$ScrollLayout,alignmentX=0.0,alignmentY=0.0,border=org.gjt.sp.jedit.textarea.JEditTextArea$TextAreaBorder@158689a,flags=288,maximumSize=,minimumSize=,preferredSize=] )
[debug] TextAreaPainter$PaintComposedText: caretPositionChanged( java.awt.event.InputMethodEvent[INPUT_METHOD_TEXT_CHANGED, no text, 0 characters committed, caret: TextHitInfo[0L], visible position: TextHitInfo[0L]] on org.gjt.sp.jedit.textarea.JEditTextArea[,0,25,767x417,layout=org.gjt.sp.jedit.textarea.JEditTextArea$ScrollLayout,alignmentX=0.0,alignmentY=0.0,border=org.gjt.sp.jedit.textarea.JEditTextArea$TextAreaBorder@158689a,flags=288,maximumSize=,minimumSize=,preferredSize=] )



引用:
FreeBSD + SCIM-uim-anthy + jdk1.4.2p7
[debug] TextAreaPainter$PaintComposedText: inputMethodTextChanged( java.awt.event.InputMethodEvent[INPUT_METHOD_TEXT_CHANGED, "" + "あ", 0 characters committed, caret: TextHitInfo[1L], no visible position] on org.gjt.sp.jedit.textarea.JEditTextArea[,0,24,672x370,layout=org.gjt.sp.jedit.textarea.JEditTextArea$ScrollLayout,alignmentX=null,alignmentY=null,border=org.gjt.sp.jedit.textarea.JEditTextArea$TextAreaBorder@f63055,flags=288,maximumSize=,minimumSize=,preferredSize=] )
[debug] TextAreaPainter$PaintComposedText: caretPositionChanged( java.awt.event.InputMethodEvent[INPUT_METHOD_TEXT_CHANGED, "" + "あ", 0 characters committed, caret: TextHitInfo[1L], no visible position] on org.gjt.sp.jedit.textarea.JEditTextArea[,0,24,672x370,layout=org.gjt.sp.jedit.textarea.JEditTextArea$ScrollLayout,alignmentX=null,alignmentY=null,border=org.gjt.sp.jedit.textarea.JEditTextArea$TextAreaBorder@f63055,flags=288,maximumSize=,minimumSize=,preferredSize=] )
[debug] TextAreaPainter$PaintComposedText: inputMethodTextChanged( java.awt.event.InputMethodEvent[INPUT_METHOD_TEXT_CHANGED, "" + "あい", 0 characters committed, caret: TextHitInfo[2L], no visible position] on org.gjt.sp.jedit.textarea.JEditTextArea[,0,24,672x370,layout=org.gjt.sp.jedit.textarea.JEditTextArea$ScrollLayout,alignmentX=null,alignmentY=null,border=org.gjt.sp.jedit.textarea.JEditTextArea$TextAreaBorder@f63055,flags=288,maximumSize=,minimumSize=,preferredSize=] )
[debug] TextAreaPainter$PaintComposedText: caretPositionChanged( java.awt.event.InputMethodEvent[INPUT_METHOD_TEXT_CHANGED, "" + "あい", 0 characters committed, caret: TextHitInfo[2L], no visible position] on org.gjt.sp.jedit.textarea.JEditTextArea[,0,24,672x370,layout=org.gjt.sp.jedit.textarea.JEditTextArea$ScrollLayout,alignmentX=null,alignmentY=null,border=org.gjt.sp.jedit.textarea.JEditTextArea$TextAreaBorder@f63055,flags=288,maximumSize=,minimumSize=,preferredSize=] )
[debug] TextAreaPainter$PaintComposedText: inputMethodTextChanged( java.awt.event.InputMethodEvent[INPUT_METHOD_TEXT_CHANGED, "" + "あいう", 0 characters committed, caret: TextHitInfo[3L], no visible position] on org.gjt.sp.jedit.textarea.JEditTextArea[,0,24,672x370,layout=org.gjt.sp.jedit.textarea.JEditTextArea$ScrollLayout,alignmentX=null,alignmentY=null,border=org.gjt.sp.jedit.textarea.JEditTextArea$TextAreaBorder@f63055,flags=288,maximumSize=,minimumSize=,preferredSize=] )
[debug] TextAreaPainter$PaintComposedText: caretPositionChanged( java.awt.event.InputMethodEvent[INPUT_METHOD_TEXT_CHANGED, "" + "あいう", 0 characters committed, caret: TextHitInfo[3L], no visible position] on org.gjt.sp.jedit.textarea.JEditTextArea[,0,24,672x370,layout=org.gjt.sp.jedit.textarea.JEditTextArea$ScrollLayout,alignmentX=null,alignmentY=null,border=org.gjt.sp.jedit.textarea.JEditTextArea$TextAreaBorder@f63055,flags=288,maximumSize=,minimumSize=,preferredSize=] )
[debug] TextAreaPainter$PaintComposedText: inputMethodTextChanged( java.awt.event.InputMethodEvent[INPUT_METHOD_TEXT_CHANGED, "" + "あいうえ", 0 characters committed, caret: TextHitInfo[4L], no visible position] on org.gjt.sp.jedit.textarea.JEditTextArea[,0,24,672x370,layout=org.gjt.sp.jedit.textarea.JEditTextArea$ScrollLayout,alignmentX=null,alignmentY=null,border=org.gjt.sp.jedit.textarea.JEditTextArea$TextAreaBorder@f63055,flags=288,maximumSize=,minimumSize=,preferredSize=] )
[debug] TextAreaPainter$PaintComposedText: caretPositionChanged( java.awt.event.InputMethodEvent[INPUT_METHOD_TEXT_CHANGED, "" + "あいうえ", 0 characters committed, caret: TextHitInfo[4L], no visible position] on org.gjt.sp.jedit.textarea.JEditTextArea[,0,24,672x370,layout=org.gjt.sp.jedit.textarea.JEditTextArea$ScrollLayout,alignmentX=null,alignmentY=null,border=org.gjt.sp.jedit.textarea.JEditTextArea$TextAreaBorder@f63055,flags=288,maximumSize=,minimumSize=,preferredSize=] )
[debug] TextAreaPainter$PaintComposedText: inputMethodTextChanged( java.awt.event.InputMethodEvent[INPUT_METHOD_TEXT_CHANGED, "" + "あいうえお", 0 characters committed, caret: TextHitInfo[5L], no visible position] on org.gjt.sp.jedit.textarea.JEditTextArea[,0,24,672x370,layout=org.gjt.sp.jedit.textarea.JEditTextArea$ScrollLayout,alignmentX=null,alignmentY=null,border=org.gjt.sp.jedit.textarea.JEditTextArea$TextAreaBorder@f63055,flags=288,maximumSize=,minimumSize=,preferredSize=] )
[debug] TextAreaPainter$PaintComposedText: caretPositionChanged( java.awt.event.InputMethodEvent[INPUT_METHOD_TEXT_CHANGED, "" + "あいうえお", 0 characters committed, caret: TextHitInfo[5L], no visible position] on org.gjt.sp.jedit.textarea.JEditTextArea[,0,24,672x370,layout=org.gjt.sp.jedit.textarea.JEditTextArea$ScrollLayout,alignmentX=null,alignmentY=null,border=org.gjt.sp.jedit.textarea.JEditTextArea$TextAreaBorder@f63055,flags=288,maximumSize=,minimumSize=,preferredSize=] )
[debug] TextAreaPainter$PaintComposedText: inputMethodTextChanged( java.awt.event.InputMethodEvent[INPUT_METHOD_TEXT_CHANGED, "あいうえお" + "", 5 characters committed, no caret, no visible position] on org.gjt.sp.jedit.textarea.JEditTextArea[,0,24,672x370,layout=org.gjt.sp.jedit.textarea.JEditTextArea$ScrollLayout,alignmentX=null,alignmentY=null,border=org.gjt.sp.jedit.textarea.JEditTextArea$TextAreaBorder@f63055,flags=288,maximumSize=,minimumSize=,preferredSize=] )
[debug] TextAreaPainter$PaintComposedText: caretPositionChanged( java.awt.event.InputMethodEvent[INPUT_METHOD_TEXT_CHANGED, "あいうえお" + "", 5 characters committed, no caret, no visible position] on org.gjt.sp.jedit.textarea.JEditTextArea[,0,24,672x370,layout=org.gjt.sp.jedit.textarea.JEditTextArea$ScrollLayout,alignmentX=null,alignmentY=null,border=org.gjt.sp.jedit.textarea.JEditTextArea$TextAreaBorder@f63055,flags=288,maximumSize=,minimumSize=,preferredSize=] )


おせっかいですが、
・OS や JDK のバージョン
・具体的に何をしようとして
・それを実現するために、どのように実装して
・どのような動作を期待して
・どのような結果が得られた
などを明記した方が有用な情報が得られやすいと思います。
お犬様
ベテラン
会議室デビュー日: 2003/01/26
投稿数: 67
投稿日時: 2005-01-07 22:11
引用:

お犬様さんの書き込み (2005-01-07 21:53) より:

ちなみに、以下は jEdit4.2 final を独自改造したもので「あいうえお」を入力して確定した際のログです。
InputMethodListener の inputMethodTextChanged() および caretPositionChanged() の両方でログを出力しています。


独自改造の部分を良く見てみたら、処理を共通化するために inputMethodTextChanged() 内で caretPositionChanged() を呼んでました。
そのため、inputMethodTextChanged() 内で caretPositionChanged() を呼ばない場合と比べてログが違います。
あと、ログが冗長になっていました。すいません。
かず
会議室デビュー日: 2005/01/07
投稿数: 4
投稿日時: 2005-01-28 11:53
お犬様さん、ありがとうございます。
そして、返信が遅くなり申し訳ありません。

どうしたものか、現在も検討中です。
返信も何を書けばよいのかわからず時間だけがたってました。
1

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