أول شيء يجب مراعاته هو كائن SwingWorkder داخل Swing، ولكن من الصعب العثور على أمثلة جاهزة على الإنترنت، لقد رجعت بشكل أساسي إلى المعلومات الموجودة على الإنترنت وقمت بتجميعها بنفسي.
ملحوظة: لا يمكن تنفيذ كائن SwingWorkder إلا مرة واحدة ولا يمكن تنفيذه بشكل متكرر! على سبيل المثال، إذا قمت بالنقر فوق ابدأ، فبمجرد انتهائه، لا يمكنك تشغيله مرة أخرى.
انسخ رمز الكود كما يلي:
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;
استيراد javax.swing.*;
import javax.swing.SwingWorker;
الطبقة العامة SwingWorkerSample {
public static void main(String[] args) {
// تعريف المظهر
يحاول {
UIManager
.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
} قبض (استثناء على سبيل المثال) {
}
// استمارة
JFrame f = new JFrame("SwingWorker Sample");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// منطقة التمثيل
Final JTextArea taOutput = new JTextArea(15, 30);
JScrollPane sp = new JScrollPane(taOutput);
f.add(sp);
// شريط التقدم السفلي
Final JProgressBarprogressBar = new JProgressBar();
f.add(BorderLayout.SOUTH,progressBar);
// زر البداية
JButton b = new JButton("ابدأ");
f.add(BorderLayout.NORTH, b);
// زر النهاية
JButton b2 = new JButton("End");
f.add(BorderLayout.AFTER_LINE_ENDS, b2);
// فئة SwingWorker
Final SwingWorker<Integer, int[]> sw = new SwingWorker<Integer, int[]>() {
/** تنفيذ العملية*/
@تجاوز
عدد صحيح محمي doInBackground() يلقي استثناء {
مجموع صحيح = 0؛
إذا (! this.isCancelled()) {
لـ (int i = 1; i <= 10; ++i) {
مجموع += أنا؛
Publish(new int[] { i, sum });// اتصل لتمثيل النتائج المتوسطة
setProgress(i * 10); // شريط التقدم
Thread.sleep(1000);
}
}
مبلغ الإرجاع؛
}
/** يمثل النتائج المتوسطة*/
@تجاوز
عملية باطلة محمية (قائمة<int[]> قطع) {
StringBuilder sb = new StringBuilder();
لـ (قيم int[] : القطع) {
sb.append(String.format("%d المتراكم يساوي %d%n"، القيم[0]، القيم[1]));
}
taOutput.append(sb.toString());
}
/** اكتملت المعالجة*/
@تجاوز
تم الفراغ المحمي () {
إذا (هذا != فارغ && !this.isDone()) {
يحاول {
نتيجة كثافة العمليات = الحصول على ()؛
taOutput.append("Finished.Total" + result + "/n");
} التقاط (InterruptedException على سبيل المثال) {
} قبض على (ExecutionException على سبيل المثال) {
}
}
}
};
// تمثيل شريط التقدم
sw.addPropertyChangeListener(new PropertyChangeListener() {
@تجاوز
خاصية الفراغ العام (PropertyChangeEvent evt) {
إذا ("التقدم". يساوي (evt.getPropertyName())) {
progressBar.setValue((Integer) evt.getNewValue());
}
}
});
// حدث زر البداية
b.addActionListener(new ActionListener() {
@تجاوز
إجراء باطل عام (ActionEvent e) {
sw.execute();// استدعاء SwingWorkder بشكل غير متزامن
}
});
// زر النهاية
b2.addActionListener(new ActionListener() {
@تجاوز
إجراء باطل عام (ActionEvent e) {
إذا (sw != null && !sw.isDone()) {
// يلغي
sw.cancel(true);
}
JOptionPane.showMessageDialog(null, "End!");
}
});
// تمثيل النموذج
f.pack();
f.setVisible(true);
}
}