Hal pertama yang perlu dipertimbangkan adalah objek SwingWorkder di dalam Swing, tetapi sulit untuk menemukan contoh yang sudah jadi di Internet. Saya terutama merujuk pada informasi di Internet dan menyusunnya sendiri.
Catatan: Objek SwingWorkder hanya dapat dieksekusi satu kali dan tidak dapat dijalankan berulang kali! Misalnya, jika Anda mengeklik Mulai, setelah berakhir, Anda tidak dapat memulainya lagi.
Copy kode kodenya sebagai berikut:
impor java.awt.BorderLayout;
import java.awt.event.*;
impor java.beans.PropertyChangeEvent;
impor java.beans.PropertyChangeListener;
impor java.util.List;
import java.util.bersamaan.ExecutionException;
import javax.swing.*;
impor javax.swing.SwingWorker;
kelas publik SwingWorkerSample {
public static void main(String[] args) {
// Definisi penampilan
mencoba {
Manajer UI
.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
} catch (Pengecualian misalnya) {
}
// membentuk
JFrame f = new JFrame("Contoh SwingWorker");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Area representasi
taOutput JTextArea akhir = JTextArea baru(15, 30);
JScrollPane sp = JScrollPane baru(taOutput);
f.tambahkan(sp);
// Bilah kemajuan bawah
final JProgressBar progresBar = JProgressBar baru();
f.add(BorderLayout.SOUTH, progresBar);
// tombol mulai
JButton b = JButton baru("Mulai");
f.add(BorderLayout.UTARA, b);
// tombol akhir
JButton b2 = JButton baru("Akhir");
f.tambahkan(BorderLayout.AFTER_LINE_ENDS, b2);
// kelas Pekerja Ayunan
final SwingWorker<Integer, int[]> sw = new SwingWorker<Integer, int[]>() {
/** Jalankan operasi*/
@Mengesampingkan
Integer yang dilindungi doInBackground() memunculkan Pengecualian {
int jumlah = 0;
if (!ini.Dibatalkan()) {
untuk (int saya = 1; saya <= 10; ++i) {
jumlah += saya;
terbitkan(new int[] { i, sum });//Panggil untuk mewakili hasil antara
setProgress(i * 10); // bilah kemajuan
Thread.tidur(1000);
}
}
jumlah pengembalian;
}
/** Mewakili hasil antara*/
@Mengesampingkan
proses kekosongan yang dilindungi(Daftar<int[]> potongan) {
StringBuilder sb = StringBuilder baru();
untuk (int[] nilai: potongan) {
sb.append(String.format("Akumulasi %d sama dengan %d%n", nilai[0], nilai[1]));
}
taOutput.append(sb.toString());
}
/** Pemrosesan selesai*/
@Mengesampingkan
dilindungi kekosongan selesai() {
jika (ini != null && !ini.isDone()) {
mencoba {
int hasil = dapatkan();
taOutput.append("Selesai.Total" + hasil + "/n");
} tangkapan (InterruptedException ex) {
} tangkapan (ExecutionException ex) {
}
}
}
};
// representasi bilah kemajuan
sw.addPropertyChangeListener(PropertiChangeListener baru() {
@Mengesampingkan
public void propertyChange(PropertyChangeEvent evt) {
if ("kemajuan".sama dengan(evt.getPropertyName())) {
progresBar.setValue((Bilangan Bulat) evt.getNewValue());
}
}
});
//Acara tombol mulai
b.addActionListener(ActionListener baru() {
@Mengesampingkan
public void actionPerformed(ActionEvent e) {
sw.execute();//Panggil SwingWorkder secara asinkron
}
});
// tombol akhir
b2.addActionListener(ActionListener baru() {
@Mengesampingkan
public void actionPerformed(ActionEvent e) {
jika (sw != null && !sw.isDone()) {
//Membatalkan
sw.batal(benar);
}
JOptionPane.showMessageDialog(null, "Akhir!");
}
});
// bentuk representasi
f.paket();
f.setVisible(benar);
}
}