La première chose à considérer est l'objet SwingWorkder dans Swing, mais il est difficile de trouver des exemples prêts à l'emploi sur Internet. Je me suis principalement référé aux informations sur Internet et j'en ai compilé une moi-même.
Remarque : L'objet SwingWorkder ne peut être exécuté qu'une seule fois et ne peut pas être exécuté de manière répétée ! Par exemple, si vous cliquez sur Démarrer, une fois le processus terminé, vous ne pourrez plus le redémarrer.
Copiez le code comme suit :
importer java.awt.BorderLayout ;
importer java.awt.event.* ;
importer java.beans.PropertyChangeEvent ;
importer java.beans.PropertyChangeListener ;
importer java.util.List ;
importer java.util.concurrent.ExecutionException ;
importer javax.swing.* ;
importer javax.swing.SwingWorker ;
classe publique SwingWorkerSample {
public static void main (String[] arguments) {
// Définition de l'apparence
essayer {
Gestionnaire d'interface utilisateur
.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
} catch (Exception ex) {
}
// formulaire
JFrame f = new JFrame("Échantillon SwingWorker");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Zone de représentation
final JTextArea taOutput = new JTextArea(15, 30);
JScrollPane sp = new JScrollPane(taOutput);
f.add(sp);
// Barre de progression inférieure
final JProgressBar progressBar = new JProgressBar();
f.add(BorderLayout.SOUTH, progressBar);
// bouton démarrer
JButton b = new JButton("Démarrer");
f.add(BorderLayout.NORTH, b);
// bouton de fin
JButton b2 = new JButton("Fin");
f.add(BorderLayout.AFTER_LINE_ENDS, b2);
// Classe SwingWorker
final SwingWorker<Integer, int[]> sw = new SwingWorker<Integer, int[]>() {
/** Exécuter l'opération*/
@Outrepasser
protected Integer doInBackground() lève une exception {
somme entière = 0 ;
si (!this.isCancelled()) {
pour (int je = 1; je <= 10; ++i) {
somme += je;
publi(new int[] { i, sum });//Appel pour représenter les résultats intermédiaires
setProgress(i * 10); // barre de progression
Thread.sleep(1000);
}
}
retourner la somme ;
}
/** Représente des résultats intermédiaires*/
@Outrepasser
processus vide protégé (Liste <int[]> morceaux) {
StringBuilder sb = new StringBuilder();
pour (int[] valeurs : morceaux) {
sb.append(String.format("%d accumulé est égal à %d%n", valeurs[0], valeurs[1]));
}
taOutput.append(sb.toString());
}
/** Traitement terminé*/
@Outrepasser
protégé void done() {
if (this != null && !this.isDone()) {
essayer {
int résultat = get();
taOutput.append("Finished. Total" + résultat + "/n");
} catch (InterruptedException ex) {
} catch (ExecutionException ex) {
}
}
}
} ;
// représentation de la barre de progression
sw.addPropertyChangeListener(new PropertyChangeListener() {
@Outrepasser
public void propertyChange (PropertyChangeEvent evt) {
if ("progress".equals(evt.getPropertyName())) {
progressBar.setValue((Integer) evt.getNewValue());
}
}
});
//Événement du bouton Démarrer
b.addActionListener(new ActionListener() {
@Outrepasser
public void actionPerformed(ActionEvent e) {
sw.execute();//Appeler SwingWorkder de manière asynchrone
}
});
// bouton de fin
b2.addActionListener(nouveau ActionListener() {
@Outrepasser
public void actionPerformed(ActionEvent e) {
if (sw != null && !sw.isDone()) {
//Annuler
sw.cancel(true);
}
JOptionPane.showMessageDialog(null, "Fin!");
}
});
// représentation du formulaire
f.pack();
f.setVisible(true);
}
}