A primeira coisa a considerar é o objeto SwingWorkder dentro do Swing, mas é difícil encontrar exemplos prontos na Internet. Consultei principalmente as informações na Internet e compilei um.
Nota: O objeto SwingWorkder só pode ser executado uma vez e não pode ser executado repetidamente! Por exemplo, se você clicar em Iniciar, quando terminar, não será possível iniciá-lo novamente.
Copie o código do código da seguinte forma:
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;
classe pública SwingWorkerSample {
public static void main(String[] args) {
//Definição de aparência
tentar {
UIManager
.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
} catch (Exceção ex) {
}
// forma
JFrame f = new JFrame("Amostra SwingWorker");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Área de representação
final JTextArea taOutput = new JTextArea(15, 30);
JScrollPane sp = new JScrollPane(taOutput);
f.adicionar(sp);
//Barra de progresso inferior
final JProgressBar progressBar = new JProgressBar();
f.add(BorderLayout.SOUTH, progressBar);
//botão iniciar
JButton b = new JButton("Iniciar");
f.add(BorderLayout.NORTH, b);
//botão final
JButton b2 = new JButton("Fim");
f.add(BorderLayout.AFTER_LINE_ENDS, b2);
//classe SwingWorker
final SwingWorker<Integer, int[]> sw = new SwingWorker<Integer, int[]>() {
/**Executa operação*/
@Substituir
Inteiro protegido doInBackground() lança exceção {
soma interna = 0;
if (!this.isCancelled()) {
for (int i = 1; i <= 10; ++i) {
soma += eu;
publish(new int[] { i, sum });//Chama para representar resultados intermediários
setProgress(i * 10); //barra de progresso
Thread.sleep(1000);
}
}
soma de retorno;
}
/** Representa resultados intermediários*/
@Substituir
processo vazio protegido (List<int[]> pedaços) {
StringBuilder sb = new StringBuilder();
for (int[] valores: pedaços) {
sb.append(String.format("%d acumulado é igual a %d%n", valores[0], valores[1]));
}
taOutput.append(sb.toString());
}
/** Processamento concluído*/
@Substituir
void protegido concluído() {
if (this! = null &&! this.isDone()) {
tentar {
int resultado = get();
taOutput.append("Concluído. Total" + resultado + "/n");
} catch (InterruptedException ex) {
} catch (ExecutionException ex) {
}
}
}
};
//representação da barra de progresso
sw.addPropertyChangeListener(new PropertyChangeListener() {
@Substituir
public void propertyChange(PropertyChangeEvent evt) {
if ("progresso".equals(evt.getPropertyName())) {
progressBar.setValue((Integer) evt.getNewValue());
}
}
});
//Evento do botão Iniciar
b.addActionListener(new ActionListener() {
@Substituir
public void actionPerformed(ActionEvent e) {
sw.execute();//chama SwingWorkder de forma assíncrona
}
});
//botão final
b2.addActionListener(new ActionListener() {
@Substituir
public void actionPerformed(ActionEvent e) {
if (sw! = null &&! sw.isDone()) {
//Cancelar
sw.cancel(verdadeiro);
}
JOptionPane.showMessageDialog(null, "Fim!");
}
});
//representação do formulário
f.pack();
f.setVisible(verdadeiro);
}
}