[英]Java Swing Updating before processing
我有一個小應用程序,此應用程序現在包含一個帶有“打開文件”按鈕的JPanel。 用戶單擊按鈕后,將創建一個新的JFileChooser,以便用戶可以選擇一個文件。
用戶選擇文件后,將對該文件進行處理。
我要做的是在處理文件時將JPanel上的文本設置為“ Processing File”。
我已經有了所有的代碼,然后在代碼之后,我調用了實際處理文件的方法,但是發生的是,它首先處理了文件,然后更新了gui組件
我該如何解決?
您應該在另一個線程中而不是在事件調度線程(EDT)中處理任務。
public void actionPerformed(ActionEvent e) {
statusLabel.setText("Processing File");
new Thread(new Runnable() {
public void run() {
// do something long task
SwingUtilities.invokeLater(new Runnable() {
public void run() {
statusLabel.setText("Done!");
}
});
}
}).start();
}
如您所知,處理文件意味着Swing線程(調用了此線程)正在等待處理完成。 因此,您需要在一個單獨的線程中調用它。
該處理應與其他內容(包括GUI更新)並行運行。 完成后,它可以回調另一個組件,以表示GUI可以更新狀態消息(請參閱SwingUtilities.invokeLater()並創建適當的Runnable來執行此操作)
您應該在單獨的線程中處理文件。 這將使您可以用一塊石頭殺死兩只鳥:首先,您的應用程序將具有更高的響應速度。 其次,標題更改實際上將發生。
OTOH,處理多線程有點棘手。 特別是,您可能希望在處理線程運行時阻止某些操作,然后需要在完成后回滾。
請記住,新線程不能直接執行GUI操作:非GUI線程必須使用SwingUtilities.invokeLater()來要求GUI線程代表其執行操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.