欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java SwingWorkder使用實例

 更新時間:2014年04月22日 13:02:50   作者:  
最近在學(xué)習(xí)Swing,我們都知道在UI表現(xiàn)線程里面長時間執(zhí)行操作時,畫面會假死,為了能夠讓費時操作不影響畫面表現(xiàn),就需要用多線程了

首先考慮的就是Swing內(nèi)部的 SwingWorkder對象,但是網(wǎng)上現(xiàn)成的例子不好找,主要參照了網(wǎng)上的資料,自己整理了一個。

注意:SwingWorkder對象只能執(zhí)行一次,不能重復(fù)執(zhí)行!例如點擊開始,結(jié)束后,就不能再次開始了。

復(fù)制代碼 代碼如下:

import java.awt.BorderLayout;
import java.awt.event.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;
import java.util.concurrent.ExecutionException;
import javax.swing.*;
import javax.swing.SwingWorker;

public class SwingWorkerSample {

    public static void main(String[] args) {

        // 外觀定義
        try {
            UIManager
                    .setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
        } catch (Exception ex) {
        }

        // 窗體
        JFrame f = new JFrame("SwingWorker Sample");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // 表示區(qū)
        final JTextArea taOutput = new JTextArea(15, 30);
        JScrollPane sp = new JScrollPane(taOutput);
        f.add(sp);

        // 底部進度條
        final JProgressBar progressBar = new JProgressBar();
        f.add(BorderLayout.SOUTH, progressBar);

        // 開始按鈕
        JButton b = new JButton("開始");
        f.add(BorderLayout.NORTH, b);

        // 結(jié)束按鈕
        JButton b2 = new JButton("結(jié)束");
        f.add(BorderLayout.AFTER_LINE_ENDS, b2);

        // SwingWorker類
        final SwingWorker<Integer, int[]> sw = new SwingWorker<Integer, int[]>() {

            /** 執(zhí)行操作 */
            @Override
            protected Integer doInBackground() throws Exception {

                int sum = 0;

                if (!this.isCancelled()) {

                    for (int i = 1; i <= 10; ++i) {
                        sum += i;
                        publish(new int[] { i, sum });// 調(diào)用表示中間結(jié)果
                        setProgress(i * 10);// 進度條
                        Thread.sleep(1000);
                    }

                }
                return sum;
            }

            /** 表示中間結(jié)果 */
            @Override
            protected void process(List<int[]> chunks) {
                StringBuilder sb = new StringBuilder();
                for (int[] values : chunks) {
                    sb.append(String.format("累加%d等于%d%n", values[0], values[1]));
                }
                taOutput.append(sb.toString());
            }

            /** 處理完成 */
            @Override
            protected void done() {

                if (this != null && !this.isDone()) {
                    try {
                        int result = get();
                        taOutput.append("完了。 合計" + result + "\n");
                    } catch (InterruptedException ex) {
                    } catch (ExecutionException ex) {
                    }
                }
            }

        };

        // 進度條表示
        sw.addPropertyChangeListener(new PropertyChangeListener() {
            @Override
            public void propertyChange(PropertyChangeEvent evt) {
                if ("progress".equals(evt.getPropertyName())) {
                    progressBar.setValue((Integer) evt.getNewValue());
                }
            }
        });

        // 開始按鈕事件
        b.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                sw.execute();// 異步調(diào)用SwingWorkder
            }
        });

        // 結(jié)束按鈕
        b2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (sw != null && !sw.isDone()) {
                    // Cancel
                    sw.cancel(true);
                }

                JOptionPane.showMessageDialog(null, "結(jié)束!");
            }
        });

        // 窗體表示
        f.pack();
        f.setVisible(true);
    }
}

相關(guān)文章

  • 基于Java的Spring框架來操作FreeMarker模板的示例

    基于Java的Spring框架來操作FreeMarker模板的示例

    這篇文章主要介紹了基于Java的Spring框架來操作FreeMarker模板的示例,講到了用于進行web模板文件的插值操作等例子,需要的朋友可以參考下
    2016-03-03
  • Spring Boot Hazelcast Caching 使用和配置詳解

    Spring Boot Hazelcast Caching 使用和配置詳解

    這篇文章主要介紹了Spring Boot Hazelcast Caching 使用和配置詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • Java8?Stream?collect(Collectors.toMap())的使用

    Java8?Stream?collect(Collectors.toMap())的使用

    這篇文章主要介紹了Java8?Stream?collect(Collectors.toMap())的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • 最有價值的50道java面試題 適用于準(zhǔn)入職Java程序員

    最有價值的50道java面試題 適用于準(zhǔn)入職Java程序員

    這篇文章主要為大家分享了最有價值的50道java面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,對hashCode方法的設(shè)計、垃圾收集的堆和代進行剖析,感興趣的小伙伴們可以參考一下
    2016-05-05
  • Java實現(xiàn)注冊登錄跳轉(zhuǎn)

    Java實現(xiàn)注冊登錄跳轉(zhuǎn)

    這篇文章主要為大家詳細介紹了Java實現(xiàn)注冊登錄跳轉(zhuǎn),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • SpringCloud中Gateway的使用教程詳解

    SpringCloud中Gateway的使用教程詳解

    SpringCloud?Gateway是Spring體系內(nèi)的一個全新項目,它旨在為微服務(wù)架構(gòu)提供一種簡單有效的統(tǒng)一的API路由管理方式。本文就來為大家詳細講講Gateway的使用教程,需要的可以參考一下
    2022-08-08
  • 詳解Java的MyBatis框架中的緩存與緩存的使用改進

    詳解Java的MyBatis框架中的緩存與緩存的使用改進

    很多人在使用MyBatis的緩存后經(jīng)常會遇到MySQL分頁查詢的顯示問題,針對于此,這里我們就來詳解Java的MyBatis框架中的緩存與緩存的使用改進,首先來回顧一下MyBatis的緩存機制與執(zhí)行:
    2016-06-06
  • java中HashMap的7種遍歷方式與性能分析

    java中HashMap的7種遍歷方式與性能分析

    本文主要介紹了java中HashMap的7種遍歷方式與性能分析,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Java實現(xiàn)簡單圖書借閱系統(tǒng)

    Java實現(xiàn)簡單圖書借閱系統(tǒng)

    這篇文章主要為大家詳細介紹了Java實現(xiàn)簡單圖書借閱系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • java實現(xiàn)時間與字符串之間轉(zhuǎn)換

    java實現(xiàn)時間與字符串之間轉(zhuǎn)換

    這篇文章主要為大家詳細介紹了java實現(xiàn)時間與字符串之間轉(zhuǎn)換,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12

最新評論