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

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

public class RestrictContinuousKeyEvent
extends javax.swing.DefaultFocusManager

JButtonに対する連続したKey操作による多重Action発火を抑制するFocusManagerのSample。

時間がかかるActionが設定されたButtonActionを 発火するためのKeyが連打された場合には、 「実際にKeyが押下された時間」と「押下Eventがdispatchされる時間」 に差が出ます。dispatchされる時間は「Actionが動作し終わった後」 となるため、この二つの時間差を判断して、差がある一定量よりも 大きい場合に2重発火とみなすという方法です。

作成者:
ogawa

フィールドの概要
protected  int delayLimit
          遅延とみなす時間[ms]。
protected  java.text.SimpleDateFormat df
          Log出力用。
 
クラス javax.swing.FocusManager から継承されたフィールド
FOCUS_MANAGER_CLASS_PROPERTY
 
クラス java.awt.KeyboardFocusManager から継承されたフィールド
BACKWARD_TRAVERSAL_KEYS, DOWN_CYCLE_TRAVERSAL_KEYS, FORWARD_TRAVERSAL_KEYS, UP_CYCLE_TRAVERSAL_KEYS
 
コンストラクタの概要
RestrictContinuousKeyEvent()
           
 
メソッドの概要
 boolean dispatchKeyEvent(java.awt.event.KeyEvent e)
          KeyEventの発生元が「AbstractButton」だった場合に遅延の判断処理を行う。
 
クラス javax.swing.DefaultFocusManager から継承されたメソッド
compareTabOrder, getComponentAfter, getComponentBefore, getFirstComponent, getLastComponent
 
クラス javax.swing.FocusManager から継承されたメソッド
disableSwingFocusManager, getCurrentManager, isFocusManagerEnabled, setCurrentManager
 
クラス java.awt.DefaultKeyboardFocusManager から継承されたメソッド
dequeueKeyEvents, discardKeyEvents, dispatchEvent, downFocusCycle, enqueueKeyEvents, 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
 

フィールドの詳細

delayLimit

protected int delayLimit
遅延とみなす時間[ms]。


ButtonのActionとして2000msかかる処理があった場合。

この場合は「実際の二回目の押下」と「二回目の押下が発生する時間」 に大きな差が出るため、delayが大きめ(この例だと、例えば1500ms)でも 二回目の押下は抑制されます。
この場合は「実際の二回目の押下」と「二回目の押下が発生する時間」 にほとんど差が出ない(おそらく100ms程度)ため、 delayが大きく設定されていると二重発火と判断されません。

つまりこの値が小さいほどより精度の高い抑制がされます。 しかしあまり小さすぎるとSpecの低いマシンでは「押下した時間」と 「dispathされる時間」に微妙な差が出たりするかもしれません。 その場合、特に時間がかかる処理が無くても、毎回「遅延している」 とみなされて常にButtonをKeyで押下出来なくなる可能性が あるかもしれません。

ちなみに、作成者のマシンでは「KeyPressedが発生した時間」と 「それがdispatchされる時間」は常に同じ値(全く遅延が無い状態)に なっていました。


df

protected java.text.SimpleDateFormat df
Log出力用。

コンストラクタの詳細

RestrictContinuousKeyEvent

public RestrictContinuousKeyEvent()
メソッドの詳細

dispatchKeyEvent

public boolean dispatchKeyEvent(java.awt.event.KeyEvent e)
KeyEventの発生元が「AbstractButton」だった場合に遅延の判断処理を行う。 これらの条件を満たさないときは何もせず親Classに処理を任せる。

定義:
インタフェース java.awt.KeyEventDispatcher 内の dispatchKeyEvent
オーバーライド:
クラス java.awt.DefaultKeyboardFocusManager 内の dispatchKeyEvent
関連項目:
EventObject.getSource(), AWTEvent.getID(), KeyEvent.getKeyChar(), InputEvent.getWhen(), KeyEvent.KEY_PRESSED, DefaultKeyboardFocusManager.dispatchKeyEvent(java.awt.event.KeyEvent)