2013-02-18 38 views
4

我有一個複雜和沉重的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方法有很多同步塊,互斥對象等,我認爲會發生一些死鎖。

任何更好的機制建議,想法?我知道最好的解決方案是檢查當前的應用程序,分析它或重寫它。但它非常複雜,沉重,模型和觀點沒有很好地組織起來。我有很短的時間,因爲客戶正在等待,需要一些臨時解決方案,技巧或黑客。

回答

3

您可以點擊一些Jbuttons中,jcheckboxes但不可能對編輯的JTextField中 對焦和編輯值了。

  • 這是在JWindowJTextField無父(JFrame)問題(很常見),使用未經修飾的JDialog代替

  • 我在這裏看到了一些問題與FocusFocusSubsystemLinux OS與去年Java version,但從未導致阻止用戶輸入到JTextField

  • 上述最佳解決方法問題是RequestFocusListener通過@camickr

  • dialog.setVisible(true);應該被包裹在invokeLater(),更看到Initial Thread (valid for all Top-Level Containers created on runtime too)

  • 沒有從你的問題清晰而不發佈的SSCCE,短,可運行,編譯,demonstraded,造成與時許問題