Ciao,
sto realizzando un programmino in Java/Swing e sto incontrando delle difficoltà nella realizzazione dell'ultimo step.
In pratica il mio programma si occupa di analizzare un file XML e riportarlo in forma più leggibile in un file XLS.
Dato che i file da elaborare sono abbastanza pesanti, vorrei fare in modo che all'utente vengano mostrati gli avanzamenti dell'elaborazione, almeno in forma testuale (ad es. "Lettura file completata", "Ordinamento campi in corso...", ecc...)
Dopo aver perso due giorni in ricerche varie e implementazione di possibili soluzioni, ho modificato come segue il main:
codice:
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
REMExtractorGui gui = new REMExtractorGui();
gui.buildGUI();
}
});
}
Alla pressione di un bottone, partono lettura del file, ordinamento dei risultati e creazione del file Excel.
Riporto di seguito il metodo ActionPerformed del listener:
codice:
public void actionPerformed(ActionEvent e) {
long start = System.currentTimeMillis();
try {
if(fileNameTextField.getText() == null || fileNameTextField.getText().isEmpty()) {
JOptionPane.showMessageDialog(frame, "Devi selezionare il file per proseguire!", "ATTENZIONE", JOptionPane.WARNING_MESSAGE);
}
else {
extractor = new Extractor(dateFromPicker.getDate(),
dateToPicker.getDate());
JDialog dialog = new JDialog(frame);
JPanel dialogPanel = new JPanel();
dialogPanel.setLayout(new BoxLayout(dialogPanel, BoxLayout.Y_AXIS));
dialogPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
dialog.add(dialogPanel);
dialog.setTitle("Elaborazione...");
dialog.setSize(200, 170);
//dialog.pack();
dialog.setLocationRelativeTo(null);
dialog.setVisible(true);
extractor.readFile(new File(fileNameTextField.getText()));
Collections.sort(extractor.getData());
WriteExcel excel = new WriteExcel("c:/temp/NEW.xls");
excel.write(extractor.getData());
dialog.setTitle("Esito");
JLabel results = new JLabel("Elaborazione terminata con successo");
dialogPanel.add(results);
JLabel executionTime = new JLabel("Tempo di esecuzione: " + (System.currentTimeMillis() - start)/1000.0 + " sec.");
executionTime.setHorizontalAlignment(JLabel.LEFT);
dialogPanel.add(executionTime);
JLabel numData = new JLabel("Dati elaborati: " + extractor.getData().size());
numData.setHorizontalAlignment(JLabel.LEFT);
dialogPanel.add(numData);
dialog.repaint();
dialog.validate();
}
}
catch(FileNotFoundException fileNotFoundEx) {
fileNotFoundEx.printStackTrace();
JOptionPane.showMessageDialog(frame, "Non è stato possibile trovare il file specificato. Impossibile continuare.", "ERRORE", JOptionPane.ERROR_MESSAGE);
}
catch(XMLStreamException xmlStreamEx) {
xmlStreamEx.printStackTrace();
JOptionPane.showMessageDialog(frame, "Si è verificato un errore durante l'elaborazione del file. Impossibile continuare.", "ERRORE", JOptionPane.ERROR_MESSAGE);
}
catch(Exception ex) {
ex.printStackTrace();
JOptionPane.showMessageDialog(frame, "E' stato rilevato un errore generico. Impossibile continuare.", "ERRORE", JOptionPane.ERROR_MESSAGE);
}
// Validate per aggiornare il posizionamento degli elementi
frame.validate();
// Repaint per aggiornare il testo delle label
frame.repaint();
}
Ho capito che devo utilizzare un thread anche in questo secondo metodo per lasciare l'elaborazione della grafica al thread principale di Swing, ma non mi è molto chiara la logica. Se lancio in un thread a parte il mio estrattore, come faccio a recuperare le eccezioni e a far visualizzare i relativi pop-up? Mi sto perdendo qualcosa?
Grazie per il supporto,
Francesco