Hi.
Ich habe eine kleine API zum Erstellen von Wizards (also Assistenten) geschrieben. Die API sorgt halt für das üblich mit den Zurück, Weiter, Abbrechen-Buttons usw. Man muss dann nur noch die gewünschten Panels registrieren, in dem man einfach von der Klasse WizardPanel erbt und dann halt den Inhalt definiert.
Jetzt habe ich folgendes Problem: Die Klasse WizardPanel implementiert vier verschiedene Methoden aus dem Interface WizardPanelListener, die zu bestimmten Zeiten aufgrufen werden, und zwar die Methode panelAboutToDisplay() unmittelbar, bevor das Panel sichtbar wird, panelDisplaying() nach dem das Panel angezeigt wird und zwei parallele Methoden, für das Ausblenden des Panels. Die kann man dann halt beliebig überschreiben, wenn man zu den gegebenen Zeiten einen bestimmten Code ausführen möchte. Das Problem ist nur, dass er bei mir das Panel nicht anzeigt, obwohl der Code aus panelDisplaying() schon ausgeführt wird. Das ärgerliche daran ist, dass dieses Panel dazu dient einen Prozessfortschritt anzuzeigen und jetzt arbeitet das alles im Hintergrund, ohne die Anzeige (damit wäre das Panel ja überflüssig). Das "Weiter"-Button des vorherigen Panels bleibt eingedrückt und das Fenster reagiert nicht, bis der Code aus displayingPanel() vollständig ausgeführt wurde. Das kann allerdings recht lange dauern, da ich Bilder erst verkleinere und dann per FTP hochlade.
Hier die entsprechenden Codestellen:
Diese Methode in der Klasse Wizard wird aufgerufen, sobald auf einen Weiter oder Zurück-Button geklickt wird:
Da steht ja eindeutig drin, dass das cardLayout zuerst die Komponente anzeigen soll und dann den Code aus panelDisplaying() ausführen.
Hier die aufgerufende Methode in der Klasse des betroffenen Panels:
Die letzte Methode createAlbum() führt dann den ganzen Code mit der Bildskalierung und dem Upload aus. Dabei sollen die beiden JProgressBars overAllProgress und currentActionProgress immer mit den aktuellen Prozesstatus anzeigen. Als Beispiel die aus FTPTransferListener implementierte Methode ftpBytesTransffered():
Wäre nett, wenn mir jemand helfen könnte! Ich hab schon verschiedene Dinge ausprobiert (z.B. den Aufruf von panelDisplaying() erst nach der vollständigen Ausführung von setCurrentPanel(), in diesem Fall in den actionPerformed()-Methoden der Actions der Weiter- und Zurückbuttons).
Gruß,
Jan.
Ich habe eine kleine API zum Erstellen von Wizards (also Assistenten) geschrieben. Die API sorgt halt für das üblich mit den Zurück, Weiter, Abbrechen-Buttons usw. Man muss dann nur noch die gewünschten Panels registrieren, in dem man einfach von der Klasse WizardPanel erbt und dann halt den Inhalt definiert.
Jetzt habe ich folgendes Problem: Die Klasse WizardPanel implementiert vier verschiedene Methoden aus dem Interface WizardPanelListener, die zu bestimmten Zeiten aufgrufen werden, und zwar die Methode panelAboutToDisplay() unmittelbar, bevor das Panel sichtbar wird, panelDisplaying() nach dem das Panel angezeigt wird und zwei parallele Methoden, für das Ausblenden des Panels. Die kann man dann halt beliebig überschreiben, wenn man zu den gegebenen Zeiten einen bestimmten Code ausführen möchte. Das Problem ist nur, dass er bei mir das Panel nicht anzeigt, obwohl der Code aus panelDisplaying() schon ausgeführt wird. Das ärgerliche daran ist, dass dieses Panel dazu dient einen Prozessfortschritt anzuzeigen und jetzt arbeitet das alles im Hintergrund, ohne die Anzeige (damit wäre das Panel ja überflüssig). Das "Weiter"-Button des vorherigen Panels bleibt eingedrückt und das Fenster reagiert nicht, bis der Code aus displayingPanel() vollständig ausgeführt wurde. Das kann allerdings recht lange dauern, da ich Bilder erst verkleinere und dann per FTP hochlade.
Hier die entsprechenden Codestellen:
Diese Methode in der Klasse Wizard wird aufgerufen, sobald auf einen Weiter oder Zurück-Button geklickt wird:
Code:
public final void setCurrentPanel(String identifier) {
if (identifier == null || !panels.containsKey(identifier))
throw new WizardPanelNotFoundException(this,
"No panel found for identifier \"" + identifier.toString()
+ "\".");
if (dialog.isVisible()) {
WizardPanel<? extends JComponent> nextPanel = panels
.get(identifier);
if (currentPanel.checkInput()) {
currentPanel.panelAboutToHide(new WizardPanelChangingEvent(
this, currentPanel, nextPanel));
currentPanel.setDisplaying(false);
oldPanel = currentPanel;
currentPanel = nextPanel;
setButtonProperties();
currentPanel.panelAboutToDisplay(new WizardPanelEvent(this,
currentPanel));
cardLayout.show(cardPanel, currentPanel.getIdentifier());
oldPanel.panelHiding(new WizardPanelChangingEvent(this,
oldPanel, nextPanel));
oldPanel.putResults();
firePropertyChange(CURRENT_PANEL_PROPERTY, oldPanel,
currentPanel);
currentPanel.setDisplaying(true);
currentPanel.panelDisplaying(new WizardPanelEvent(this,
currentPanel));
} else
currentPanel.inputInvalid();
} else {
if (currentPanel != null)
oldPanel = currentPanel;
currentPanel = panels.get(identifier);
}
}
Hier die aufgerufende Methode in der Klasse des betroffenen Panels:
Code:
@Override
public void panelDisplaying(WizardPanelEvent e) {
setBackButtonEnabled(false);
setFinishButtonEnabled(false, false);
setCancelButtonEnabled(false);
fotoscoutTools.getFTPManager().addFTPTransferListener(this);
fotoscoutTools.getDatabase().addDatabaseListener(this);
result = new HashMap<String, Object>(0);
result.putAll(basicSettingsPanel.getResult());
result.putAll(imagesPanel.getResult());
createAlbum();
}
Code:
public void ftpBytesTransffered(FTPTransferEvent e) {
if (e.getLocalFile().equals(currentFile))
currentActionProgress.setValue(e.getKiloBytesTransffered());
}
Wäre nett, wenn mir jemand helfen könnte! Ich hab schon verschiedene Dinge ausprobiert (z.B. den Aufruf von panelDisplaying() erst nach der vollständigen Ausführung von setCurrentPanel(), in diesem Fall in den actionPerformed()-Methoden der Actions der Weiter- und Zurückbuttons).
Gruß,
Jan.