我有一個包含文本字段的JFrame的應用程序。當字段中的文本被修改,並且該字段獲得事件時,它立即將其內容寫入外部數據庫。如何在應用程序退出之前讓文本字段失去焦點?
但是,如果用戶在字段仍然關注的情況下退出應用程序,則不會發送focusLost
消息,並且不會保存已修改的數據。
我該如何強制將焦點丟失到一個字段上,或許在我的WindowListener
的windowClosing
方法中?我嘗試在該方法中使用requestFocusInWindow()
,但它沒有幫助。
我有一個包含文本字段的JFrame的應用程序。當字段中的文本被修改,並且該字段獲得事件時,它立即將其內容寫入外部數據庫。如何在應用程序退出之前讓文本字段失去焦點?
但是,如果用戶在字段仍然關注的情況下退出應用程序,則不會發送focusLost
消息,並且不會保存已修改的數據。
我該如何強制將焦點丟失到一個字段上,或許在我的WindowListener
的windowClosing
方法中?我嘗試在該方法中使用requestFocusInWindow()
,但它沒有幫助。
爲什麼不直接調用窗口監聽器的windowClosing方法內容寫入外部數據庫的相同方法?
@Override
public void windowClosing(WindowEvent e) {
// call write to DB method
System.exit(0);
}
的繞了另一種方式:
更改JFrame
到DO_NOTHING_ON_CLOSE
的setDefaultCloseOperation
,並顯示一個確認對話框,當用戶想要關閉該窗口。該對話框將獲得焦點,在文本框的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中間不要退出。)
您的最後一點很好。我的情況實際上比原先提出的問題要複雜得多。我的應用程序中的大部分工作(包括數據庫寫入)都在工作線程中,並且我假設焦點事件(和關閉請求)在事件派發線程中發送。關閉應用程序必須等待工作線程中的所有東西完成。 – user1198411
待一個更好的答案,可能是由更有經驗的人即將出臺我是,這是我正在做的。
在我的windowClosing在我的WindowListener()方法,我把:
dispatchEvent(new FocusEvent(getFocusOwner(), FocusEvent.FOCUS_LOST));
我的問題簡化的情況一點。有幾個文本字段,每個都以不同的方式寫入數據庫。通常發送focusLost事件似乎比windowClosing()方法確定是否存在焦點字段,然後將焦點字段發送給focusLost更容易,而且肯定比複製所有不同的數據庫寫入代碼更容易。 – user1198411
@ user1198411:你的問題是一個XY問題 - 你試圖解決錯誤的事情。問題不在於如何強制重點丟失事件,這是沒有意義的,而是應用程序關閉時如何寫入數據庫。這就是Coop正在回答的問題,也是你應該關注的問題。 –