|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Aug 2007
Messaggi: 64
|
[Java] Swing JProgressBar
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 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);
}
}
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
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".
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
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
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:24.



















