Einen wundervollen,
so jetzt bin ich auch mal dran, dass mich gehelft wird
Ich habe eine Swing-Anwendung in einem JDK 1.5. Ist vom Auftraggeber vorgegeben. Innerhalb dieser Anwendung soll der Benutzer einen Ordner angeben und alle darin befindlichen Dateien sollen eingelesen werden. Beim Einlesen werden noch Informationen über die Datei gesammelt, was bei einigen Daten etwas dauert. Sprich ich möchte dem Benutzer in dieser Zeit etwas grafisches geben und dachte da an ein JProgressBar. Die Pfad-Auswahl, den Einlese-Algorithmus und der Fortschrittsbalken stehen schon. Der Fortschrittsbalken liegt auf einem modalen Dialog der von einem ActionListener instanziiert wird. Nun starte ich den Thread.
Thread:
Action:
Dialog:
Das Problem ist, dass der ActionListener schon das Ergebnis des modalen Dialoges abfragt und der steht default-mäßig auf ABORT bei mir. Dann ist es natürlich klar, dass er nicht weitergeht in der Verarbeitung.
Vllt hat jemand eine sinnvolle Idee, wie man diese Zwickmühle löst.
Danke Euer Eistee
so jetzt bin ich auch mal dran, dass mich gehelft wird
Ich habe eine Swing-Anwendung in einem JDK 1.5. Ist vom Auftraggeber vorgegeben. Innerhalb dieser Anwendung soll der Benutzer einen Ordner angeben und alle darin befindlichen Dateien sollen eingelesen werden. Beim Einlesen werden noch Informationen über die Datei gesammelt, was bei einigen Daten etwas dauert. Sprich ich möchte dem Benutzer in dieser Zeit etwas grafisches geben und dachte da an ein JProgressBar. Die Pfad-Auswahl, den Einlese-Algorithmus und der Fortschrittsbalken stehen schon. Der Fortschrittsbalken liegt auf einem modalen Dialog der von einem ActionListener instanziiert wird. Nun starte ich den Thread.
Thread:
Java:
public class PreviewPreWorkingThread extends Thread {
private static final Logger logger = Logger.getLogger(PreviewPreWorkingThread.class);
private Upload upload;
private IProgressDialog<Collection<Upload>> dialog;
private boolean finish = false;
@Override
public void run() {
super.run();
dialog.setVisible(true);
if (logger.isTraceEnabled()) {
logger.trace("Thread für die Vorbereitung der Vorschau wurde betreten");
}
Collection<Upload> resultCollection = new LinkedList<Upload>();
File directory = new File(upload.getPfad());
dialog.updateProgress(0, "-----", "Vorbereitungen für das Einlesen!");
try {
File[] listFiles = directory.listFiles();
int count = 0, max = listFiles.length;
dialog.setProgressMinMax(count, max + 1);
for (File f : listFiles) {
if (logger.isDebugEnabled()) {
logger.debug("Datei " + count + " von " + max + " ist '" + f.getName() + "'");
}
dialog.updateProgress(count, count + " / " + max, f.getName());
resultCollection.add(
new Upload(
upload.getUmgebung(),
upload.getVerfahren(),
upload.getBenutzer(),
upload.getArt(),
upload.getSubject(),
f.getPath()));
count++;
}
dialog.setResults(resultCollection);
dialog.setVisible(false);
} catch (Exception e) {
logger.error(e.getMessage(), e);
resultCollection = null;
dialog.setVisible(false);
}
finish = true;
if (logger.isTraceEnabled()) {
logger.trace("Thread für die Vorbereitung der Vorschau wird verlassen");
}
}
public PreviewPreWorkingThread(IProgressDialog<Collection<Upload>> dialog, Upload upload) {
this.upload = upload;
this.dialog = dialog;
}
public boolean isFinish() {
return finish;
}
}
Action:
Java:
public class FolderPreviewAction implements ActionListener {
private static final Logger logger = Logger.getLogger(FolderPreviewAction.class);
private static Resource resource = SpringApplicationContextAware.getResourceBundleFactory();
private IFilePanel panel;
public void actionPerformed(ActionEvent e) {
if (logger.isTraceEnabled()) {
logger.trace("Preview-Aktion aus dem FolderPanel aufgerufen!");
}
IErrors errors = panel.validateInputs();
if (!errors.hasErrors()) {
Upload upload = panel.getUploadDataObject();
ProgressDialog dialog = new ProgressDialog(panel.getParentFrame(), "Fortschritt");
PreviewPreWorkingThread t = new PreviewPreWorkingThread(dialog, upload);
SwingUtilities.invokeLater(t);
DialogResults result = dialog.getResult();
Collection<Upload> results = dialog.getResults();
dialog.dispose();
if (DialogResults.OK == result) {
System.out.println(results);
}
} else {
JOptionPane.showMessageDialog(
(Component) e.getSource(),
ErrorDialogHelper.getErrorDialogMessage(errors),
resource.getMessage("dialog.validate"),
JOptionPane.ERROR_MESSAGE,
Icons.FAILURE.getIcon());
}
}
public FolderPreviewAction(IFilePanel panel) {
super();
this.panel = panel;
}
}
Dialog:
Java:
public class ProgressDialog extends AbstractBasicDialog implements IProgressDialog<Collection<Upload>> {
private static final long serialVersionUID = 1L;
private static final Logger logger = Logger.getLogger(ProgressDialog.class);
private JProgressBar progress;
private JLabel label;
private Collection<Upload> resultCollection;
public ProgressDialog(Frame owner, String title) throws HeadlessException {
super(owner, title, true, 400, 150);
JPanel contentPanel = getMyContentPanel();
contentPanel.setLayout(new BorderLayout());
contentPanel.setBorder(BorderFactory.createTitledBorder("Fortschritt bei der Vorbeiterung für die Vorschau:"));
progress = new JProgressBar(JProgressBar.HORIZONTAL);
progress.setString("------");
progress.setStringPainted(true);
label = new JLabel("", SwingConstants.CENTER);
label.setPreferredSize(new Dimension(25,25));
contentPanel.add(generateContentPanel(), BorderLayout.CENTER);
}
@Override
protected JPanel generateContentPanel() {
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
JLabel label = new JLabel("Verarbeitete Dateien: ");
label.setPreferredSize(new Dimension(25,25));
panel.add(label, BorderLayout.PAGE_START);
panel.add(progress, BorderLayout.CENTER);
panel.add(this.label, BorderLayout.PAGE_END);
return panel;
}
public Collection<Upload> getResults() {
return resultCollection;
}
public void updateProgress(int value, String msg, String fileName) {
if (logger.isDebugEnabled()) {
logger.debug("Fortschritt soll auf [Wert=" + value + "] [Nachricht=" + msg + "] [Datei=" + fileName + "] aktualisiert werden.");
}
label.setText("Verarbeitung der Datei '" + fileName + "' läuft!");
label.repaint();
progress.setValue(value);
progress.setString(msg);
progress.repaint();
}
public void setProgressMinMax(int min, int max) {
progress.setMinimum(min);
progress.setMaximum(max);
}
public void setResults(Collection<Upload> results) {
resultCollection = results;
if (results != null) {
result = DialogResults.OK;
}
}
}
Das Problem ist, dass der ActionListener schon das Ergebnis des modalen Dialoges abfragt und der steht default-mäßig auf ABORT bei mir. Dann ist es natürlich klar, dass er nicht weitergeht in der Verarbeitung.
Vllt hat jemand eine sinnvolle Idee, wie man diese Zwickmühle löst.
Danke Euer Eistee