PDA

View Full Version : [Java] Swing JProgressBar


basileus_82
11-02-2012, 18:11
ciao a tutti

mi sto accingendo a studiare il packege Swing e Awt

ho fatto un piccolo programmino che scrive su un file excel (non riporto la classe chiamata per scrivere sul file excel)

il problema è questo:
1)quando avvio l'elaborazione premendo sul tasto AVVIA, dovrebbe cominciare anche il progressbar (settato su indeterminato), invece sia avvia alla fine quando l'elaborazione è finita
2) è possibile fare l'elaborazione in backgroud? Mi speigo, durante l'elaborazione il tasto AVVIA rimane cliccato, e non si può fare nulla nel frattempo

grazie per le risposte

ecco il codice



import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.JFileChooser;
import java.io.*;

public class FileEsteroToExcel extends JPanel {
WriteExcel w ;
JButton button;
JFileChooser fc ;
File selFile;
int n;
JTextField textField ;
JButton openFileChooser;
JProgressBar progressBar;

public FileEsteroToExcel() {
super(new BorderLayout());
createPanel();

}

private void createPanel() {
JPanel panelButton = new JPanel();
JPanel panelRun = new JPanel();
JPanel panelpbar = new JPanel();
panelButton.setBackground(Color.BLUE);
panelButton.setSize(600,200);
panelRun.setBackground(Color.RED);
panelRun.setSize(600,200);
panelpbar.setBackground(Color.GREEN);
panelpbar.setSize(600,200);
openFileChooser = new JButton("Apri File");
openFileChooser.setToolTipText("Apri file dell'estero");
textField = new JTextField(20);
panelButton.add(openFileChooser);
JButton button = new JButton("Avvia");
button.setBounds(50, 60, 80, 30);
button.setToolTipText("Avvia");
progressBar = new JProgressBar();

openFileChooser.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
JFileChooser fileChooser = new JFileChooser();
int n = fileChooser.showOpenDialog(FileEsteroToExcel.this);
if (n == JFileChooser.APPROVE_OPTION) {
File f = fileChooser.getSelectedFile();
textField.setText(f.getAbsolutePath());
}
}
});
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
if (textField.getText().equals("")) {
System.out.println("Campo vuoto");
} else {
progressBar.setIndeterminate(true);
w = new WriteExcel("K:/portatile_hp/estero_excel/FileEsteroToExcel/TERNA_OBJECTS-D168_vs_D166.TXT") ;
w.scriviExcel();
}
}
});
panelButton.add(openFileChooser);
panelButton.add(textField);
panelRun.add(button);
panelpbar.add(progressBar);
add(panelButton, BorderLayout.NORTH);
add(panelRun, BorderLayout.CENTER);
add(panelpbar, BorderLayout.SOUTH);
}

public static void main(String[] args) {
JFrame frame = new JFrame("FileEsteroToExcel");
FileEsteroToExcel ex = new FileEsteroToExcel();
frame.getContentPane().add(ex);
frame.setSize(600, 400);
frame.setLocationRelativeTo(null);
frame.setResizable(false);
frame.pack();
frame.setVisible(true);

}
}

PGI-Bis
12-02-2012, 17:22
Per fartela breve, il contenuto di un actionPerformed è di norma eseguito dal thread dell'interfaccia utente. Lo stesso thread si occupa anche di ridisegnare la progress bar. Se scriviExcel() non è lancia un nuovo thread e fa quel che deve fare allora anche lui sarà eseguito dal thread di prima e siccome sta eseguendo "scriviExcel" il nostro thread non può aggiornare la progress bar.

Supponendo che WriteExcel non sia concorrente, puoi fare così:

...
disabilita il pulsante di avvio
progressBar.setIndeterminate(true);
crea e lancia un nuovo thread che:
-esegue la scrittura di write excel
-quando ha finito nasconde la progress bar e riabilita il pulsante avvio

Per via dell'architettura a thread singolo delle api awt/swing, l'ultimo compito del nuovo thread deve essere eseguito dal thread dell'interfaccia.

Anche quello che hai scritto nel main dovrebbe essere eseguito da quel thread ma non stiamo qui a spaccare il capello in quattro.

Alla fine della fiera, puoi usare SwingWorker per gestire questa faccenda del "faccio qualcosa in background e quando ho finito rifaccio qualcosa sull'interfaccia".

banryu79
13-02-2012, 09:51
Ciao basileus_82,
se ti dovesse servire, nella mia firma c'è il link a un tutorial introduttivo su Swing in pdf sintetico e ben strutturato (oltre a essere in italiano). Te lo consiglio perchè tratta proprio le questioni che stai affrontando, con il bonus che l'autore è l'utente che ti ha risposto qui sopra, così se qualcosa non ti è chiaro o vuoi ulteriori chiarimenti lo puoi tartassare di domande :D