สิ่งแรกที่ต้องพิจารณาคือวัตถุ SwingWorkder ภายใน Swing แต่เป็นการยากที่จะค้นหาตัวอย่างสำเร็จรูปบนอินเทอร์เน็ต ฉันอ้างอิงข้อมูลบนอินเทอร์เน็ตเป็นหลักและรวบรวมด้วยตัวเอง
หมายเหตุ: วัตถุ SwingWorkder สามารถดำเนินการได้เพียงครั้งเดียวและไม่สามารถดำเนินการซ้ำได้! ตัวอย่างเช่น หากคุณคลิกเริ่ม เมื่อสิ้นสุด คุณจะไม่สามารถเริ่มใหม่ได้อีก
คัดลอกรหัสรหัสดังต่อไปนี้:
นำเข้า java.awt.BorderLayout;
นำเข้า java.awt.event.*;
นำเข้า java.beans.PropertyChangeEvent;
นำเข้า java.beans.PropertyChangeListener;
นำเข้า java.util.List;
นำเข้า java.util.concurrent.ExecutionException;
นำเข้า javax.swing.*;
นำเข้า javax.swing.SwingWorker;
SwingWorkerSample คลาสสาธารณะ {
โมฆะคงที่สาธารณะ main (String [] args) {
// คำจำกัดความลักษณะที่ปรากฏ
พยายาม {
UIManager
.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
} จับ (ข้อยกเว้นเช่น) {
-
// รูปร่าง
JFrame f = new JFrame("ตัวอย่าง SwingWorker");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//พื้นที่การเป็นตัวแทน
สุดท้าย JTextArea taOutput = JTextArea ใหม่ (15, 30);
JScrollPane sp = JScrollPane ใหม่ (taOutput);
f.เพิ่ม(sp);
// แถบความคืบหน้าด้านล่าง
JProgressBar สุดท้าย ProgressBar = JProgressBar ใหม่ ();
f.add(BorderLayout.SOUTH, แถบความคืบหน้า);
// ปุ่มเริ่มต้น
JButton b = JButton ใหม่ ("เริ่ม");
f.add(BorderLayout.NORTH, b);
// ปุ่มสิ้นสุด
JButton b2 = JButton ใหม่ ("สิ้นสุด");
f.add(BorderLayout.AFTER_LINE_ENDS, b2);
// คลาส SwingWorker
สุดท้าย SwingWorker<จำนวนเต็ม int[]> sw = ใหม่ SwingWorker<จำนวนเต็ม int[]>() {
/** ดำเนินการดำเนินการ*/
@แทนที่
จำนวนเต็มที่ได้รับการป้องกัน doInBackground() พ่นข้อยกเว้น {
ผลรวมทั้งหมด = 0;
ถ้า (!this.isCancelled()) {
สำหรับ (int i = 1; i <= 10; ++i) {
ผลรวม += ฉัน;
publish(new int[] { i, sum });//เรียกเพื่อแสดงผลลัพธ์ระดับกลาง
setProgress(i * 10); // แถบความคืบหน้า
เธรด.สลีป(1,000);
-
-
จำนวนเงินที่ส่งคืน;
-
/** แสดงถึงผลลัพธ์ระดับกลาง*/
@แทนที่
กระบวนการโมฆะที่ได้รับการป้องกัน (รายการ <int []> ชิ้น) {
StringBuilder sb = StringBuilder ใหม่ ();
สำหรับ (ค่า int[] : ชิ้น) {
sb.append(String.format("สะสม %d เท่ากับ %d%n", ค่า[0], ค่า[1]));
-
taOutput.append(sb.toString());
-
/** การประมวลผลเสร็จสมบูรณ์*/
@แทนที่
โมฆะที่ได้รับการป้องกันเสร็จแล้ว () {
ถ้า (นี่ != null && !this.isDone()) {
พยายาม {
ผลลัพธ์ int = รับ ();
taOutput.append("เสร็จสิ้นแล้ว ผลรวม" + ผลลัพธ์ + "/n");
} จับ (InterruptedException เช่น) {
} จับ (ExecutionException เช่น) {
-
-
-
-
// การแสดงแถบความคืบหน้า
sw.addPropertyChangeListener (คุณสมบัติใหม่ ChangeListener () {
@แทนที่
โมฆะสาธารณะทรัพย์สินเปลี่ยน (PropertyChangeEvent evt) {
ถ้า ("ความคืบหน้า".เท่ากับ(evt.getPropertyName())) {
ความคืบหน้าBar.setValue((จำนวนเต็ม) evt.getNewValue());
-
-
-
//เหตุการณ์ปุ่มเริ่ม
b.addActionListener (ActionListener ใหม่ () {
@แทนที่
การกระทำที่เป็นโมฆะสาธารณะดำเนินการ (ActionEvent e) {
sw.execute();//เรียก SwingWorkder แบบอะซิงโครนัส
-
-
// ปุ่มสิ้นสุด
b2.addActionListener (ActionListener ใหม่ () {
@แทนที่
การกระทำที่เป็นโมฆะสาธารณะดำเนินการ (ActionEvent e) {
ถ้า (sw != null && !sw.isDone()) {
// ยกเลิก
sw.ยกเลิก(จริง);
-
JOptionPane.showMessageDialog(null, "สิ้นสุด!");
-
-
// การแสดงแบบฟอร์ม
f.แพ็ค();
f.setVisible(จริง);
-
-