Lo primero que hay que considerar es el objeto SwingWorkder dentro de Swing, pero es difícil encontrar ejemplos ya preparados en Internet. Principalmente consulté la información en Internet y compilé uno yo mismo.
Nota: ¡El objeto SwingWorkder solo se puede ejecutar una vez y no se puede ejecutar repetidamente! Por ejemplo, si hace clic en Iniciar, una vez que finalice, no podrá iniciarlo nuevamente.
Copie el código de código de la siguiente manera:
importar java.awt.BorderLayout;
importar java.awt.event.*;
importar java.beans.PropertyChangeEvent;
importar java.beans.PropertyChangeListener;
importar java.util.List;
importar java.util.concurrent.ExecutionException;
importar javax.swing.*;
importar javax.swing.SwingWorker;
clase pública SwingWorkerSample {
público estático vacío principal (String [] argumentos) {
// Definición de apariencia
intentar {
Administrador de UI
.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
} captura (Excepción ex) {
}
// forma
JFrame f = nuevo JFrame("Muestra de SwingWorker");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Área de representación
final JTextArea taOutput = nuevo JTextArea(15, 30);
JScrollPane sp = nuevo JScrollPane(taOutput);
f.add(sp);
// barra de progreso inferior
final JProgressBar barra de progreso = nueva JProgressBar();
f.add(BorderLayout.SUR, barra de progreso);
// botón de inicio
JButton b = nuevo JButton("Inicio");
f.add(BorderLayout.NORTE, b);
// botón finalizar
JButton b2 = nuevo JButton("Fin");
f.add(BorderLayout.AFTER_LINE_ENDS, b2);
// clase SwingWorker
final SwingWorker<Entero, int[]> sw = nuevo SwingWorker<Entero, int[]>() {
/** Ejecutar operación*/
@Anular
El entero protegido doInBackground() lanza una excepción {
suma int = 0;
si (!this.isCancelled()) {
para (int i = 1; i <= 10; ++i) {
suma += i;
publicar (nuevo int [] {i, suma}); // Llamada para representar resultados intermedios
setProgress(i * 10); // barra de progreso
Hilo.dormir(1000);
}
}
suma de devolución;
}
/** Representa resultados intermedios*/
@Anular
proceso vacío protegido (Lista<int[]> fragmentos) {
StringBuilder sb = nuevo StringBuilder();
for (int[] valores: trozos) {
sb.append(String.format("%d acumulado es igual a %d%n", valores[0], valores[1]));
}
taOutput.append(sb.toString());
}
/** Procesamiento completado*/
@Anular
vacío protegido hecho() {
si (esto! = nulo &&! this.isDone()) {
intentar {
int resultado = obtener();
taOutput.append("Terminado. Total" + resultado + "/n");
} captura (excepción interrumpida ex) {
} captura (ExecutionException ex) {
}
}
}
};
// representación de la barra de progreso
sw.addPropertyChangeListener(nuevo PropertyChangeListener() {
@Anular
cambio de propiedad público vacío (evento de cambio de propiedad) {
if ("progreso".equals(evt.getPropertyName())) {
ProgressBar.setValue((Integer) evt.getNewValue());
}
}
});
//Evento del botón de inicio
b.addActionListener(nuevo ActionListener() {
@Anular
acción vacía pública realizada (ActionEvent e) {
sw.execute();//Llamar asincrónicamente a SwingWorkder
}
});
// botón finalizar
b2.addActionListener(nuevo ActionListener() {
@Anular
acción vacía pública realizada (ActionEvent e) {
si (sw != nulo && !sw.isDone()) {
//Cancelar
sw.cancel(verdadero);
}
JOptionPane.showMessageDialog(nulo, "¡Fin!");
}
});
// forma de representación
f.paquete();
f.setVisible (verdadero);
}
}