2009-09-25 50 views
0

我有一個小應用程序,目前由一個帶有「打開文件」按鈕的JPanel組成。 一旦用戶單擊按鈕,將創建一個新的JFileChooser,以便用戶可以選擇一個文件。Java Swing處理前更新

一旦用戶選擇了一個文件,該文件將被處理。

我想要做的是在文件正在處理時,將JPanel上的文本設置爲「處理文件」。

我有這一切的代碼,然後將代碼之後,我調用該方法實際處理的文件,但發生的事情是,它首先處理的文件,然後更新GUI組件

我如何解決這個問題?

回答

0

正如您已經確定的那樣,處理文件意味着Swing線程(調用它)正在等待處理完成。所以你需要在一個單獨的線程中調用它。

處理應該與其他東西(包括GUI更新)並行運行。完成後,它可以回撥另一個組件,以表示GUI可以更新狀態消息(請參閱SwingUtilities.invokeLater()並創建適當的Runnable來執行此操作)。

0

您應該在單獨的線程中處理該文件。這可以讓你一箭雙鵰:首先,你的應用會更加快速響應。其次,標題變更將實際發生。

OTOH,處理多線程有點棘手。特別是,您可能想要在處理線程運行時阻止某些操作,然後在完成時需要回滾。

請記住,新線程無法直接執行GUI操作:非GUI線程必須使用SwingUtilities.invokeLater()來請求GUI線程以其名義執行操作。

+0

你也可以使用任務從Swing應用程序框架 –

+0

你能澄清你的「回退」聲明? –

+0

回滾:您可能希望在處理髮生時禁用「打開文件」菜單項。所以你在啓動你的線程之前就這樣做了。處理完成後,您需要重新啓用該菜單項。恢復原始標題也是回滾行爲。 –

1

您應該在另一個線程中處理您的任務,而不是在事件分派線程(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(); 
} 

Using a Swing Worker Thread