簡體   English   中英

搖擺焦點問題,失去焦點,焦點不被調用

[英]swing focus issue, lost focus, focusgain not invoked

我有一個復雜而繁重的swing客戶端應用程序,其中包含許多模態組件,jdialogs,內部框架等。在某些情況下,出現問題並且不可能再關注swing文本字段。 您可以單擊某些jbuttons,jcheckbox,但不可能在可編輯的jtextfields上聚焦和編輯值。 不會觸發可編輯文本字段的gainfocus事件,只有在執行文本字段單擊時才會調用requestfocus方法。 我發現了一種方法(黑客)所以解決有問題的情況,當故障情況發生時,你顯示一些joptionpane消息或模態jdialog並通過點擊或處理關閉它,問題消失你可以點擊文本字段並編輯它們。 作為一個解決方案,我做了一些檢查,如果你嘗試專注於一個組件,我在clicked textfield的requestfocus事件中啟動一個計時器線程,並將實例保持為focusrequesting組件。 一段時間后,我檢查最后一個焦點組件

KeyboardManager.getCurrentKeyboardFocusManager()。getPermanentFocusOwner()

如果沒有問題,並且文本字段獲得焦點,則返回的對象(getPermanentFocusOwner的返回值)與focusrequesting組件的實例相同。 但是如果出現問題的情況,返回的對象與請求焦點的焦點不同,我通過以下方式打開我的臨時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方法有很多同步塊,互斥對象等,我認為會出現一些死鎖。

有沒有更好的機制建議,想法? 我知道最好的解決方案是檢查當前的應用程序,分析它或重寫它。 但它非常復雜,沉重,模型和視圖組織得不好。 我的時間很短,因為客戶正在等待,需要一些暫時的解決方案,技巧或黑客。

您可以單擊某些jbuttons,jcheckbox,但不可能在可編輯的jtextfields上聚焦和編輯值。

  • 這是JWindow沒有父( JFrame )的JTextField問題(很常見),請使用未修飾的JDialog代替

  • 我在這里看到了有關最新Java version Linux OS上的FocusFocusSubsystem一些問題,但從未導致阻止用戶輸入JTextField

  • 上午問題的最佳解決方法是@camickr RequestFocusListener

  • dialog.setVisible(true); 應該包裝在invokeLater() ,更多參見初始線程(對運行時創建的所有頂級容器都有效)

  • 沒有發布SSCCE ,簡短,可運行,可編輯,演示,問題導致你的問題沒有明確的問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM