【Java swing】SwingWorker開啟子線程背景執行任務
- 核心代碼
- 示例代碼
在主線程直接執行方法會阻塞主線程,方法執行完之前,界面會卡住無法操作等情況,這時候,我們需要使用SwingWorker類來實作背景子線程執行。
核心代碼
private void startPrint() {
//調用方法
startPrint().execute();
}
private SwingWorker<Void, Void> startPrint() {
SwingWorker<Void, Void> print = new SwingWorker<Void, Void>() {
@Override
protected Void doInBackground() throws Exception {
//需要背景執行任務
return null;
}
};
return print;
}
示例代碼
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.*;
public class SwingWorkerTest {
public JPanel showJP;//主面闆
public static void main(String[] args){
SwingWorkerTest swt=new SwingWorkerTest();
swt.init();
}
public void init(){
JFrame jframe=new JFrame();
jframe.setSize(800,200);
jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jframe.setLayout(new BorderLayout());
// 不可改變視窗大小
jframe.setResizable(false);
// 設定标題
jframe.setTitle("SwingWorker示例");
// 設定視窗關閉确認框
jframe.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
jframe.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
int flag = JOptionPane.showConfirmDialog(jframe, "是否确認退出系統?",
"提示!", JOptionPane.YES_NO_OPTION,
JOptionPane.INFORMATION_MESSAGE);
if(JOptionPane.YES_OPTION == flag){
System.exit(0);
}else{
return;
}
}
});
showJP=new JPanel();
showJP.setBounds(0,0,800,200);
JButton print = new JButton();
print.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (print.isEnabled()) {
System.out.println("執行列印");
startPrint().execute();
System.out.println("執行其他方法");
}
}
});
print.setText("列印");
print.setFont(new Font("SimSun", Font.PLAIN, 18));
print.setBounds(300, (int)100, 200, 30);
showJP.add(print);
jframe.add(showJP);
jframe.setVisible(true);
}
private SwingWorker<Void, Void> startPrint() {
SwingWorker<Void, Void> print = new SwingWorker<Void, Void>() {
@Override
protected Void doInBackground() throws Exception {
//需要背景執行任務
System.out.println("開始列印");
Thread.sleep(5000);
System.out.println("列印完成");
return null;
}
};
return print;
}
}