簡體   English   中英

在處理之前更新Java Swing

[英]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 Worker線程

如您所知,處理文件意味着Swing線程(調用了此線程)正在等待處理完成。 因此,您需要在一個單獨的線程中調用它。

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

您應該在單獨的線程中處理文件。 這將使您可以用一塊石頭殺死兩只鳥:首先,您的應用程序將具有更高的響應速度。 其次,標題更改實際上將發生。

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

請記住,新線程不能直接執行GUI操作:非GUI線程必須使用SwingUtilities.invokeLater()來要求GUI線程代表其執行操作。

暫無
暫無

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

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