私はSwingアプリケーションに問題があり、現在は識別できない理由で、テキスト入力フィールドでフォーカスが得られることがあります。私は何らかの競合状態を疑うが、フォーカスイベントの原因を知ることはできない。Java Swing UIでのフォーカス要求の起点の特定
フィールドにはフォーカスリスナーが関連付けられているため、フォーカスをフォーカスするイベントハンドラにブレークポイントを追加するのは簡単です。私が行ったとき、私はCausedFocusEvent.Causeのインスタンスを含む基礎イベントを見ることができます。名前フィールドは「ACTIVATION」に設定されています。スタックトレースを見ると
、私は以下を参照してくださいすることができますのInputFieldは、テキストのレンダリングに関連する軽微な変更であることのJTextFieldのサブクラスである
Thread [AWT-EventQueue-0] (Suspended (breakpoint at line 174 in MyPanel$3))
MyPanel$3.focusGained(FocusEvent) line: 174
AWTEventMulticaster.focusGained(FocusEvent) line: not available
InputField(Component).processFocusEvent(FocusEvent) line: not available
InputField(Component).processEvent(AWTEvent) line: not available
InputField(Container).processEvent(AWTEvent) line: not available
InputField(Component).dispatchEventImpl(AWTEvent) line: not available
InputField(Container).dispatchEventImpl(AWTEvent) line: not available
InputField(Component).dispatchEvent(AWTEvent) line: not available
DefaultKeyboardFocusManager(KeyboardFocusManager).redispatchEvent(Component, AWTEvent) line: not available
DefaultKeyboardFocusManager.typeAheadAssertions(Component, AWTEvent) line: not available
DefaultKeyboardFocusManager.dispatchEvent(AWTEvent) line: not available
InputField(Component).dispatchEventImpl(AWTEvent) line: not available
InputField(Container).dispatchEventImpl(AWTEvent) line: not available
InputField(Component).dispatchEvent(AWTEvent) line: not available
SunToolkit$1.run() line: not available
PeerEvent(InvocationEvent).dispatch() line: not available
EventQueue.dispatchEventImpl(AWTEvent, Object) line: not available
EventQueue.access$200(EventQueue, AWTEvent, Object) line: not available
EventQueue$3.run() line: not available
EventQueue$3.run() line: not available
AccessController.doPrivileged(PrivilegedAction<T>, AccessControlContext) line: not available [native method]
ProtectionDomain$1.doIntersectionPrivilege(PrivilegedAction<T>, AccessControlContext, AccessControlContext) line: not available
EventQueue.dispatchEvent(AWTEvent) line: not available
EventDispatchThread.pumpOneEventForFilters(int) line: not available
EventDispatchThread.pumpEventsForFilter(int, Conditional, EventFilter) line: not available
EventDispatchThread.pumpEventsForHierarchy(int, Conditional, Component) line: not available
EventDispatchThread.pumpEvents(int, Conditional) line: not available
EventDispatchThread.pumpEvents(Conditional) line: not available
EventDispatchThread.run() line: not available
注意を。
私がスタックトレースから知ることは、EDT上の何かがMyPanelのInputFieldにフォーカスを当てていることです。
このコンポーネントでフォーカスが得られた理由を私に見てもらえる情報はありますか?
すべてのSwingイベントは単一スレッドEDTで実行する必要があるため、競合状態は発生しません。問題が解消するまでコードを切り捨て、問題を再現する最小限のコードを見つけようとしてから、ここにコードを投稿して、問題の原因となるコードを切り離すことを検討してください。不思議そうなこと:FocusListenerを何のために使用していますか? –
私はシングルスレッドについて同意しますが、私の懸念は、スイングが基本的なレンダリングを非決定論的な順序で実行している可能性があり、何かがその順序に不注意に依存していることです。フォーカスリスナーは主にデバッグのためのものであり、フォーカスが得られたときに影響を与えることはなく、ただ反応します。 – PhilDin
'は、EDT上の何かが、MyPanelのInputFieldがフォーカスを獲得した原因です。???より良いヘルプのために、早くSSCCEをポストしてください。ショート、実行可能、コンパイル可能、focusGainedの原因はInputFieldからJVM例外によってリダイレクトされるto MyPanel – mKorbel