Das erste, was man in Betracht ziehen sollte, ist das SwingWorkder-Objekt in Swing, aber es ist schwierig, vorgefertigte Beispiele im Internet zu finden. Ich habe hauptsächlich auf die Informationen im Internet verwiesen und selbst eines zusammengestellt.
Hinweis: Das SwingWorkder-Objekt kann nur einmal und nicht wiederholt ausgeführt werden! Wenn Sie beispielsweise auf „Start“ klicken, können Sie den Vorgang nach dem Ende nicht erneut starten.
Kopieren Sie den Codecode wie folgt:
import java.awt.BorderLayout;
import java.awt.event.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
java.util.List importieren;
import java.util.concurrent.ExecutionException;
javax.swing.* importieren;
import javax.swing.SwingWorker;
öffentliche Klasse SwingWorkerSample {
public static void main(String[] args) {
// Aussehensdefinition
versuchen {
UIManager
.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
} Catch (Ausnahme ex) {
}
// bilden
JFrame f = new JFrame("SwingWorker Sample");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Darstellungsbereich
final JTextArea taOutput = new JTextArea(15, 30);
JScrollPane sp = new JScrollPane(taOutput);
f.add(sp);
// Unterer Fortschrittsbalken
final JProgressBar progressBar = new JProgressBar();
f.add(BorderLayout.SOUTH, progressBar);
// Startknopf
JButton b = new JButton("Start");
f.add(BorderLayout.NORTH, b);
// End-Taste
JButton b2 = new JButton("End");
f.add(BorderLayout.AFTER_LINE_ENDS, b2);
// SwingWorker-Klasse
final SwingWorker<Integer, int[]> sw = new SwingWorker<Integer, int[]>() {
/** Vorgang ausführen*/
@Override
protected Integer doInBackground() löst eine Ausnahme aus {
int Summe = 0;
if (!this.isCancelled()) {
for (int i = 1; i <= 10; ++i) {
Summe += i;
Publish(new int[] { i, sum });//Aufruf zur Darstellung von Zwischenergebnissen
setProgress(i * 10); // Fortschrittsbalken
Thread.sleep(1000);
}
}
Rückgabesumme;
}
/** Stellt Zwischenergebnisse dar*/
@Override
protected void Process(List<int[]> chunks) {
StringBuilder sb = new StringBuilder();
for (int[] Werte: Chunks) {
sb.append(String.format("Akkumuliertes %d ist gleich %d%n", Werte[0], Werte[1]));
}
taOutput.append(sb.toString());
}
/** Verarbeitung abgeschlossen*/
@Override
protected void done() {
if (this != null && !this.isDone()) {
versuchen {
int result = get();
taOutput.append("Fertig. Gesamt" + Ergebnis + "/n");
} Catch (InterruptedException ex) {
} Catch (ExecutionException ex) {
}
}
}
};
// Darstellung des Fortschrittsbalkens
sw.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("progress".equals(evt.getPropertyName())) {
progressBar.setValue((Integer) evt.getNewValue());
}
}
});
//Schaltflächenereignis starten
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
sw.execute();//SwingWorkder asynchron aufrufen
}
});
// End-Taste
b2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (sw != null && !sw.isDone()) {
// Stornieren
sw.cancel(true);
}
JOptionPane.showMessageDialog(null, "End!");
}
});
// Formulardarstellung
f.pack();
f.setVisible(true);
}
}