[英]Java Swing multi threads and ui freezes
無法弄清楚這一點。 使用worker或invokeLater,UI仍然凍結。 下載每個文件后,我希望更新JList。 但是JList僅在踩踏返回后才更新。
這是代碼:
public class MyUi extends javax.swing.JFrame{
...
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt){
SwingUtilities.invokeLater(new Runnable() {
//To get out of the event tread
public void run() {
dl();
}
});
}
private void dl(){
...
//ini and run the download class
Download myDownload = new Download();
myDownload.doDownload(myDlList);
}
public void updateJlist(String myString){
myModel.addElement(myString);
jList1.repaint();
}
}
public class Download{
...
public void doDownload(String[] fileName){
for(int i=0; i<fileName.length; i++){
...//download action...
//for my jList1 to be updated after each file.
MyUi.updateJlist(fileName[i]);
}
}
}
任何示例都會有所幫助。
invokeLater
與您期望的完全相反-它在EDT上運行操作,從而解釋了行為。
將文件下載到后台線程上,然后將updateJlist()
包裝到Runnable
。
SwingWorker
將更加可靠。
附錄:作為@mre筆記, SwingWorker
也可以很容易地報告中期業績,如圖所示這里 。
我創建了一個WorkerThread類,該類負責線程和GUI當前/主線程。 當發生事件啟動XXXServer時,我將我的GUI應用程序放在WorkerThread的Construct()方法中,然后所有線程均被激活,GUI順利工作,而沒有凍結。 看一看。
/ ** *動作事件* * @參見java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)* /
公共無效actionPerformed(ActionEvent ae){log.info(“ actionPerformed begin ...” + ae.getActionCommand());
try {
if (ae.getActionCommand().equals(btnStart.getText())) {
final int portNumber = 9990;
try {
WorkerThread workerThread = new WorkerThread(){
public Object construct(){
log.info("Initializing the Server GUI...");
// initializing the Server
try {
xxxServer = new XXXServer(portNumber);
xxxServer.start();
btnStart.setEnabled(false);
} catch (IOException e) {
// TODO Auto-generated catch block
log.info("actionPerformed() Start button ERROR IOEXCEPTION..." + e.getMessage());
e.printStackTrace();
}
return null;
}
};workerThread.start();
} catch (Exception e) {
log.info("actionPerformed() Start button ERROR..." + e.getMessage());
e.printStackTrace();
}
} else if (ae.getActionCommand().equals(btnStop.getText())) {
log.info("Exit..." + btnStop.getText());
closeWindow();
}
} catch (Exception e) {
log
.info("Error in ServerGUI actionPerformed==="
+ e.getMessage());
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.