天天看點

【Java swing】SwingWorker開啟子線程背景執行任務核心代碼示例代碼

【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;
    }
}