我有一個複雜和沉重的swing客戶端應用程序,其中包含許多模式compponents,jdialogs,內部框架等在某些情況下,發生問題,並且不可能關注swing文本字段了。您可以點擊一些jbuttons,jcheckboxes,但不可能在可編輯的jtextfields上重新編輯值。 gainfocus不再觸發可編輯文本字段的事件,當您執行單擊文本字段時,只會調用requestfocus方法。 我發現了一種方法(黑客),以解決問題的情況下,當發生故障時,並顯示一些joptionpane消息或模式jdialog並關閉它通過點擊或處置,問題消失任何你可以點擊上文本框和編輯它們。 作爲解決方案,我做了一些檢查,如果您嘗試關注組件,我會在單擊的textfield的requestfocus事件中啓動計時器線程,並將實例保留爲focusrequesting組件。一段時間後,我通過擺動焦點問題,失去焦點,focusgain未調用
KeyboardManager.getCurrentKeyboardFocusManager()。getPermanentFocusOwner()
檢查最後焦點的組件如果沒有發生問題,且文本框獲得焦點,返回的對象(getPermanentFocusOwner的retur值)與焦點請求組件是相同的實例。但是,如果有問題的情況下發生,返回的對象是來自重點不同一個請求,我打開我暫時的JDialog:
JDialog dialog=new OptionPane().createDialog(KeyboardFocusManager.getCurrentFocusManager().getActiveWindow(), "");
dialog.setModal(true);
// MUST be modal to fix the lost focus case
// start closing thread, which closes the dialog after some few time by dialog.dispose
new Closer(dialog).start();
dialog.setVisible(true);
這種機制,我現在還不是很穩定。在某些情況下,dialog.dispose()不起作用,臨時窗口始終保持在屏幕上,不可關閉,並且由於它是模態的,客戶端不能再執行任何操作。該對話框必須是模態的以解決焦點問題,因爲非模態對話框不能解決上述的焦點問題。 jdialog的dispose方法有很多同步塊,互斥對象等,我認爲會發生一些死鎖。
任何更好的機制建議,想法?我知道最好的解決方案是檢查當前的應用程序,分析它或重寫它。但它非常複雜,沉重,模型和觀點沒有很好地組織起來。我有很短的時間,因爲客戶正在等待,需要一些臨時解決方案,技巧或黑客。