2016-12-22 46 views
0

我有一個包含文本字段的JFrame的應用程序。當字段中的文本被修改,並且該字段獲得事件時,它立即將其內容寫入外部數據庫。如何在應用程序退出之前讓文本字段失去焦點?

但是,如果用戶在字段仍然關注的情況下退出應用程序,則不會發送focusLost消息,並且不會保存已修改的數據。

我該如何強制將焦點丟失到一個字段上,或許在我的WindowListenerwindowClosing方法中?我嘗試在該方法中使用requestFocusInWindow(),但它沒有幫助。

回答

4

爲什麼不直接調用窗口監聽器的windowClosing方法內容寫入外部數據庫的相同方法?

@Override 
public void windowClosing(WindowEvent e) { 
    // call write to DB method 
    System.exit(0); 
} 
+0

我的問題簡化的情況一點。有幾個文本字段,每個都以不同的方式寫入數據庫。通常發送focusLost事件似乎比windowClosing()方法確定是否存在焦點字段,然後將焦點字段發送給focusLost更容易,而且肯定比複製所有不同的數據庫寫入代碼更容易。 – user1198411

+2

@ user1198411:你的問題是一個XY問題 - 你試圖解決錯誤的事情。問題不在於如何強制重點丟失事件,這是沒有意義的,而是應用程序關閉時如何寫入數據庫。這就是Coop正在回答的問題,也是你應該關注的問題。 –

2

的繞了另一種方式:
更改JFrameDO_NOTHING_ON_CLOSEsetDefaultCloseOperation,並顯示一個確認對話框,當用戶想要關閉該窗口。該對話框將獲得焦點,在文本框的FocusListener上觸發focusLost方法。

frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 
frame.addWindowListener(new WindowAdapter() { 
     @Override 
     public void windowClosing(WindowEvent e) { 
      int result = JOptionPane 
        .showConfirmDialog(null, "Are you sure?", 
          "Confirm exit", JOptionPane.YES_NO_OPTION); 
       if(result == 0) { 
        System.exit(0); 
       } 
      }    
     } 
    }); 

(注:如果你用這種方法去,一定要以書面形式向DB中間不要退出。)

+0

您的最後一點很好。我的情況實際上比原先提出的問題要複雜得多。我的應用程序中的大部分工作(包括數據庫寫入)都在工作線程中,並且我假設焦點事件(和關閉請求)在事件派發線程中發送。關閉應用程序必須等待工作線程中的所有東西完成。 – user1198411

0

待一個更好的答案,可能是由更有經驗的人即將出臺我是,這是我正在做的。

在我的windowClosing在我的WindowListener()方法,我把:

dispatchEvent(new FocusEvent(getFocusOwner(), FocusEvent.FOCUS_LOST)); 
相關問題