jp.ne.mki.wedge.education.focusmanager
クラス EnqueueNoWaitKeyboardFocusManager

java.lang.Object
  上位を拡張 java.awt.KeyboardFocusManager
      上位を拡張 java.awt.DefaultKeyboardFocusManager
          上位を拡張 jp.ne.mki.wedge.education.focusmanager.EnqueueNoWaitKeyboardFocusManager
すべての実装されたインタフェース:
java.awt.KeyEventDispatcher, java.awt.KeyEventPostProcessor

public class EnqueueNoWaitKeyboardFocusManager
extends java.awt.DefaultKeyboardFocusManager

enqueueKeyEventsの引数の値にdispatchKeyEventでの時間を渡すKeyboardFocusManager。

JDK1.5.0_10以降 (2007/06/05現在 JDK1.5.0_11,12 も含む) のJDKを使用した場合、 フォーカスを取得していないComponentに対して、KeyEventが処理されComponent に反映してしまう現象が発生します。
この現象は、重い処理中(メインスレッドにて何かの処理中)に、TABにてFocus移動を含んだ KEY入力を行った際に、テキストのフォーカス移動"後" (After処理後) に Keyが反映されるという 不具合を招くことになり、内部データと表示データとの整合性が合わない という現象になって 現れます。

JDK1.5.0_10での変更の詳細については、Javaネイティブコードに達する為、詳細把握はできていませんが、、 DefaultKeyboardFocusManager.enqueueKeyEvents(long, Component)の 第一引数の long の時間を、DefaultKeyboardFocusManager.dispatchKeyEvent(KeyEvent) のタイミングの InputEvent.getWhen() の値に置き換える処理を組み込むことにより、 JDK1.5.0_09以前の動きと擬似的に同じできるのを確認し、このクラスでは その処理を組み込んだ KeyboardFocusManagerになります。
但し、この対応方法は、根本的な解決ではないため、これによる副作用がある可能性があります。
(製品のテストケースは全て通るのは確認していますが、予想外の副作用が潜んでいる可能性があります。)

このJDK1.5.0_09とJDK1.5.0_10との挙動の差は JDK1.5.0_10 のリリースノートに記述されている、 バグID:6448190 「JFrame と JButton でフォーカスの問題」 での修正に依るものと考えられますので、 その修正よる不具合解決はできなくなる可能性があります。

JDK1.5.0_10,11 にて InputVerifierにて、waitをかけている間に TABでのFocus移動を含んだKEY操作を行った場合でも
InputVerifier.verify(javax.swing.JComponent) がCallされた後に Text上にKEYが反映される ため、InputVerifier.verify(javax.swing.JComponent) にて正確にチェックが行えない という現象を確認しています。(JDK1.5.0_10,JDK1.5.0_11,JDK1.6.0,JDK1.6.0_01にて確認)
そのためこの現象はJavaSwingの不具合になります。
新しいJDKがリリースされて、この不具合が解決された場合、このKeyboardFocusManagerクラスを設定せずとも 不具合が解消される可能性があります。

使用にあたって (利用許諾)

このライブラリはフリーソフトウェアです。
このライブラリは役に立つことを願って配布しますが、完全 無保証 です。
本ライブラリを利用して損害が発生した場合、当社は一切の責任を負いません。

ある特定条件下(タイミング、製品・JDKバージョン)では動作不良を招くなどの可能性もありますので、 使用有無判断/テスト は自己責任でお願いします。

このライブラリは 製品サポート の対象外になります。
お問い合わせには一切応じかねますので予めご了承ください。

作成者:
Media Knowledge Industrial Co.,Ltd.

フィールドの概要
 
クラス java.awt.KeyboardFocusManager から継承されたフィールド
BACKWARD_TRAVERSAL_KEYS, DOWN_CYCLE_TRAVERSAL_KEYS, FORWARD_TRAVERSAL_KEYS, UP_CYCLE_TRAVERSAL_KEYS
 
コンストラクタの概要
EnqueueNoWaitKeyboardFocusManager()
           
 
メソッドの概要
 boolean dispatchKeyEvent(java.awt.event.KeyEvent e)
          dispatchKeyEvent
protected  void enqueueKeyEvents(long after, java.awt.Component untilFocused)
          enqueueKeyEvents
 
クラス java.awt.DefaultKeyboardFocusManager から継承されたメソッド
dequeueKeyEvents, discardKeyEvents, dispatchEvent, downFocusCycle, focusNextComponent, focusPreviousComponent, postProcessKeyEvent, processKeyEvent, upFocusCycle
 
クラス java.awt.KeyboardFocusManager から継承されたメソッド
addKeyEventDispatcher, addKeyEventPostProcessor, addPropertyChangeListener, addPropertyChangeListener, addVetoableChangeListener, addVetoableChangeListener, clearGlobalFocusOwner, downFocusCycle, firePropertyChange, fireVetoableChange, focusNextComponent, focusPreviousComponent, getActiveWindow, getCurrentFocusCycleRoot, getCurrentKeyboardFocusManager, getDefaultFocusTraversalKeys, getDefaultFocusTraversalPolicy, getFocusedWindow, getFocusOwner, getGlobalActiveWindow, getGlobalCurrentFocusCycleRoot, getGlobalFocusedWindow, getGlobalFocusOwner, getGlobalPermanentFocusOwner, getKeyEventDispatchers, getKeyEventPostProcessors, getPermanentFocusOwner, getPropertyChangeListeners, getPropertyChangeListeners, getVetoableChangeListeners, getVetoableChangeListeners, redispatchEvent, removeKeyEventDispatcher, removeKeyEventPostProcessor, removePropertyChangeListener, removePropertyChangeListener, removeVetoableChangeListener, removeVetoableChangeListener, setCurrentKeyboardFocusManager, setDefaultFocusTraversalKeys, setDefaultFocusTraversalPolicy, setGlobalActiveWindow, setGlobalCurrentFocusCycleRoot, setGlobalFocusedWindow, setGlobalFocusOwner, setGlobalPermanentFocusOwner, upFocusCycle
 
クラス java.lang.Object から継承されたメソッド
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

コンストラクタの詳細

EnqueueNoWaitKeyboardFocusManager

public EnqueueNoWaitKeyboardFocusManager()
メソッドの詳細

dispatchKeyEvent

public boolean dispatchKeyEvent(java.awt.event.KeyEvent e)
dispatchKeyEvent

定義:
インタフェース java.awt.KeyEventDispatcher 内の dispatchKeyEvent
オーバーライド:
クラス java.awt.DefaultKeyboardFocusManager 内の dispatchKeyEvent
パラメータ:
e -

enqueueKeyEvents

protected void enqueueKeyEvents(long after,
                                java.awt.Component untilFocused)
enqueueKeyEvents

オーバーライド:
クラス java.awt.DefaultKeyboardFocusManager 内の enqueueKeyEvents
パラメータ:
after -
untilFocused -