Dialogfenster wird nicht aktualisiert/CardLayout

Status
Nicht offen für weitere Antworten.
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:
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);
	}
    }
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:
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();
	}
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():
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.
 
Hi.

Ich hab es jetzt auch damit probiert, nach jeder Änderung an den Fortschrittsbalken validate() im Dialog aufzurufen, das machte aber keinen Unterschied.

Kann mir jemand helfen?!

Gruß,
Jan.
 

André Uhres

Top Contributor
jan-hillebrand hat gesagt.:
..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 ist eindeutig ein Threadproblem. Der Teil, der lange dauert, muss unbedingt in einem unabhängigen Thread laufen (s.a. SwingWorker). Alle Veränderungen an der grafischen Oberfläche sollten auf dem EDT geschehen (-> SwingUtilities.invokeLater).
 
Ja, dass das was mit Threads zu tun hat habe ich mir jetzt allmählich auch gedacht. Das hier ist meine erste größere GUI die ich in Java schreibe, ich kenne mich damit nicht sonderlich gut aus.

EDIT: Code entfernt, weil die ganze Seite dadurch viel zu breit war und es nicht wirklich wichtig ist.

Ich möchte also immer, nachdem ein bestimmter Teil fertig ist die Anzeige der Fortschrittsbalken verändern, das sollte ich dann aber nicht aus meinem SwingWoker Thread heraus machen, oder? Oder mache ich diese Veränderungen dann in der Methode done()? Muss ich also für jede Teilaufgabe einen extra SwingWorker schreiben?
Sollte ich für die IO-Prozesse, die Datenbankabfragen vornehmen oder FTP-Befehle ausführen auch jeweils einen extra SwingWorker definieren, hier kommt es nämlich öfters zu längeren Wartezeiten in denen die GUI nicht antwortet?
 

André Uhres

Top Contributor
jan-hillebrand hat gesagt.:
..Ich möchte also immer, nachdem ein bestimmter Teil fertig ist die Anzeige der
Fortschrittsbalken verändern, das sollte ich dann aber nicht aus meinem SwingWoker Thread heraus machen, oder?
Oder mache ich diese Veränderungen dann in der Methode done()? Muss ich also für jede Teilaufgabe einen extra SwingWorker schreiben?
Sollte ich für die IO-Prozesse, die Datenbankabfragen vornehmen oder FTP-Befehle ausführen auch jeweils einen extra
SwingWorker definieren, hier kommt es nämlich öfters zu längeren Wartezeiten in denen die GUI nicht antwortet?
Der Sinn einer Progressbar ist ja normalerweise, den Fortschritt eines langen Prozesses anzuzeigen
noch während dieser Prozess im Hintergrund läuft, also in der Methode SwingWorker#doInBackground*.
Wenn das nicht möglich ist, kann man die Progressbar auch einfach unbestimmt machen: setIndeterminate(true).
Natürlich kannst du auch noch in der Methode done()* die Progressbar verändern, oder vielleicht sogar unsichtbar machen.
Einen oder mehrere SwingWorkers auszuführen, ist eigentlich nur eine Designfrage:
wenn du mehrere gleichzeitig startest, dann laufen sie eben gleichzeitig,
ansonsten macht es ja eigentlich keinen grossen Unterschied ob du eine Arbeit in einem Stück machst
oder in mehreren sich ablösenden Häppchen.

*wem diese Methode neu erscheint: ja, das ist neu in Java 6 :wink:
 
Ok, danke schon mal, ich hab es zwar noch nicht ausprobiert, aber ich denke, du hast mir damit sehr weiter geholfen.

Ich werde das jetzt erstmal implementieren und melde mich, sobald es wieder Probleme gibt oder alles klappt.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J vom Dialogfenster ein Feld des Hauptfenster einlesen AWT, Swing, JavaFX & SWT 2
D Geöffnetes Dialogfenster schließen AWT, Swing, JavaFX & SWT 11
L selbsterstelltes Dialogfenster AWT, Swing, JavaFX & SWT 6
C SWT SWT Dialogfenster blitzen bei deren Aufruf AWT, Swing, JavaFX & SWT 2
K Größe einer Scrollbar im Dialogfenster ändern AWT, Swing, JavaFX & SWT 2
M eigenes DialogFenster AWT, Swing, JavaFX & SWT 4
B Dialogfenster AWT, Swing, JavaFX & SWT 6
W Shortcuts für Dialogfenster mit SWT AWT, Swing, JavaFX & SWT 2
P Methode wird nicht überprüft AWT, Swing, JavaFX & SWT 4
P paintComponent-Methode wird dauernd neu aufgerufen AWT, Swing, JavaFX & SWT 2
G JavaFX LineChart Datenpunkte Markierung wird abgeschnitten AWT, Swing, JavaFX & SWT 1
P JTextField wird nur sehr klein angezeigt und verändert die Größe nicht AWT, Swing, JavaFX & SWT 3
Telisti Javafx Image wird nicht richtig integiert AWT, Swing, JavaFX & SWT 8
J Netbeans die JavaFX-Anwendung wird nicht ausgeführt AWT, Swing, JavaFX & SWT 16
N €-Zeichen wird nicht akzeptiert AWT, Swing, JavaFX & SWT 4
G Problem mit der Anzeige von jLabel. Unlesbar wenn der Text geändert wird. AWT, Swing, JavaFX & SWT 28
berserkerdq2 Wie füge ich ein Bild in javafx mit dem Scenebuilder ein, das automatisch mitgezogen wird, wenn das Fenster vergrößert wird oder Vollbildmodus AWT, Swing, JavaFX & SWT 6
L jComboBox Actionlistener wird beim erstmaligen Befüllen getriggert AWT, Swing, JavaFX & SWT 7
_user_q Objekt.setSelected(false), wenn es nicht mehr fokussiert wird AWT, Swing, JavaFX & SWT 2
S Javafx getResource-Pfad wird nicht erkannt AWT, Swing, JavaFX & SWT 7
U Warum wird zweimal die Affinetransformation estellt (2Dgraphics, Java)? AWT, Swing, JavaFX & SWT 31
DonBronson Gezeichnetes Objekt verschwindet nachdem erneut gezeichnet wird AWT, Swing, JavaFX & SWT 8
ProggersWorld JavaFX TextArea BackgroundImage wird nicht angezeigt AWT, Swing, JavaFX & SWT 3
M Bild wird nicht geladen obwohl sie gefunden wird AWT, Swing, JavaFX & SWT 0
M Nach Export als Runnable Jar wird css nicht merh gefunden AWT, Swing, JavaFX & SWT 22
izoards Outlook Mail erstellen - Signatur wird nicht angezeigt. AWT, Swing, JavaFX & SWT 3
J actionperformed wird nicht aufgerufen/ repaint() AWT, Swing, JavaFX & SWT 6
J Swing Komponente wird unpassend angepasst in der Größe AWT, Swing, JavaFX & SWT 35
J Java FX NullPointerException, ObservableList wird in View nicht angezeigt.. AWT, Swing, JavaFX & SWT 34
S Next_Button wird nicht ausgeführt. AWT, Swing, JavaFX & SWT 6
FrittenFritze Ein Problem mit der CSSBox, die Größe wird nicht angepasst AWT, Swing, JavaFX & SWT 5
CptK windowClosed() nur aufrufen, wenn Fenster nicht über Button geschlossen wird AWT, Swing, JavaFX & SWT 1
J Komponente wird manchmal falsch gezeichnet AWT, Swing, JavaFX & SWT 0
J Swing JList wird nicht angezeigt AWT, Swing, JavaFX & SWT 6
JMölleri Swing Image wird unscharf dargestellt AWT, Swing, JavaFX & SWT 2
JojoSand Java Programm wird nicht gestartet - keinen Fehlerhinweis AWT, Swing, JavaFX & SWT 9
R Text vom Jlabel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
D JavaFX Bearbeitetes Bild wird nicht gespeichert AWT, Swing, JavaFX & SWT 9
J setOnCloseRequest wird nicht ausgelöst AWT, Swing, JavaFX & SWT 3
P JavaFX Fenster wird nicht angezeigt (Mac) AWT, Swing, JavaFX & SWT 13
B JavaFX Bei Scenen-Wechsel im primaryStage wird aktuelle Fenstergröße nicht mit übernommen AWT, Swing, JavaFX & SWT 16
B JavaFX Warum wird hier eine NullPointer-Exception geworfen? AWT, Swing, JavaFX & SWT 7
M JavaFX javaFX Label-Text wird nicht gesetzt AWT, Swing, JavaFX & SWT 3
O Swing "Eigenes" JPanel wird dem JScrollPane nicht hinzugefügt AWT, Swing, JavaFX & SWT 5
L Swing JLabel wird beim ändern der Schriftart immer neu gezeichnet. AWT, Swing, JavaFX & SWT 2
R Layout Manager null und Component wird nicht hinzugefügt AWT, Swing, JavaFX & SWT 3
Zrebna JavaFX-Projekt mit Bildern funktioniert nicht - um Hilfe wird gebeten AWT, Swing, JavaFX & SWT 14
kodela BufferStrategy wird nicht gefunden AWT, Swing, JavaFX & SWT 5
J JPanel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
S ImageView wird dem Gridpane nicht zugefügt AWT, Swing, JavaFX & SWT 1
G Repaint wird nicht durchgeführt AWT, Swing, JavaFX & SWT 8
E Warum wird Text im JTextArea erst am Programmende angezeigt ? AWT, Swing, JavaFX & SWT 1
S Swing Panel wird nicht neu gezeichnet AWT, Swing, JavaFX & SWT 3
M Swing GUI wird nach invokeLater() langsam AWT, Swing, JavaFX & SWT 19
Bluedaishi TableView mit Combox wert wird nicht in die TableView gesetzt AWT, Swing, JavaFX & SWT 38
L JFrame wird zu klein erstellt AWT, Swing, JavaFX & SWT 7
T JavaFX Nach Zoomen wird an falscher Stelle gezeichnet AWT, Swing, JavaFX & SWT 0
kodela Swing Letzte Änderung in der Tabelle wird nicht gespeichert AWT, Swing, JavaFX & SWT 5
cool_brivk24 AWT BufferedImage wird nicht geladen AWT, Swing, JavaFX & SWT 17
S JavaFX Wird es überhaupt genutzt? AWT, Swing, JavaFX & SWT 3
FRI3ND GUI wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
J Canvas wird nicht angezeigt AWT, Swing, JavaFX & SWT 10
K Swing JScrollPane wird nicht angezeigt wenn man Components darstellt. AWT, Swing, JavaFX & SWT 2
ralfb1105 Swing Wert in JTextField wird falsch ausgegeben AWT, Swing, JavaFX & SWT 2
B JavaFX Text wird nicht angezeigt, kein Fehler AWT, Swing, JavaFX & SWT 2
J Aus welchen Grund wird der Button nicht angezeigt im GridPane? AWT, Swing, JavaFX & SWT 1
J MouseListener wird nicht ausgeführt. AWT, Swing, JavaFX & SWT 4
E Swing Liste in Scrollpane wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
J Controller wird zu groß, was tun ? AWT, Swing, JavaFX & SWT 5
CptK Wieso wird nur ein Teil meiner Buttons angezeigt? AWT, Swing, JavaFX & SWT 1
T Label wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
M Aktion ausführen wenn ein JRadiobutton deselektiert wird. AWT, Swing, JavaFX & SWT 3
DaCrazyJavaExpert Swing JPanel "ContentPane" wird nicht gesetzt/angezeigt AWT, Swing, JavaFX & SWT 16
I JavaFX Fenster wird auf einem anderen Rechner anders dargestellt AWT, Swing, JavaFX & SWT 5
zhermann FX Label text wird nicht richtig angezeigt AWT, Swing, JavaFX & SWT 12
zhermann TableView wird nicht gefüllt AWT, Swing, JavaFX & SWT 14
it_is_all Warum wird die JTable im JDialog nicht angezeigt? AWT, Swing, JavaFX & SWT 1
zhermann JavaFX Main App wird nicht geöffnet AWT, Swing, JavaFX & SWT 6
Naxon89 JavaFX Image wird nicht korrekt geladen AWT, Swing, JavaFX & SWT 3
4 Swing JLabel wird ,,abgehackt" AWT, Swing, JavaFX & SWT 3
DaCrazyJavaExpert Swing Größe des JPanel ändern/wird nicht geändert. AWT, Swing, JavaFX & SWT 3
DaCrazyJavaExpert Swing JPanel wird in JScollPane nicht angezeigt AWT, Swing, JavaFX & SWT 2
D JFrame wird nicht richtig angezeigt AWT, Swing, JavaFX & SWT 1
P Kein Bild wird angezeigt bei ImageIcon AWT, Swing, JavaFX & SWT 16
MaxG. JavaFX Inhalt in Tableview wird nicht angezeigt AWT, Swing, JavaFX & SWT 11
T JButton wird beim vergrößern des Fensters erst sichtbar AWT, Swing, JavaFX & SWT 4
A Swing Tabelle wird bei Betätigung des Button nicht befüllt AWT, Swing, JavaFX & SWT 17
krgewb 2D-Grafik paint-Methode wird zu oft ausgeführt AWT, Swing, JavaFX & SWT 5
G Nur ein JPanel wird angezeigt AWT, Swing, JavaFX & SWT 9
M Swing Inhalt meines JTables wird falsch dargestellt AWT, Swing, JavaFX & SWT 8
T Default Table wird nicht angezeigt AWT, Swing, JavaFX & SWT 15
H Musik wird nach dem erstellen der .jar Datei nicht mehr abgespielt AWT, Swing, JavaFX & SWT 1
K JavaFX Stage wird nicht angezeigt AWT, Swing, JavaFX & SWT 9
B JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 1
A Swing Bild wird nicht mehr geladen AWT, Swing, JavaFX & SWT 4
U Swing Inhalt vom Fenster wird erst durch Hovern oder Klicken sichtbar AWT, Swing, JavaFX & SWT 3
D iText PDF wird nach Neustart nicht importiert AWT, Swing, JavaFX & SWT 0
Thallius Wer oder was bestimmt welches Frame toFront kommt wenn ein anderes geschlossen wird? AWT, Swing, JavaFX & SWT 8
X JavaFX AreaChart area höhe wird nicht richtig dargestellt AWT, Swing, JavaFX & SWT 2
Z Swing Frame wird geöffnet, aber ist ohne Inhalt AWT, Swing, JavaFX & SWT 0

Ähnliche Java Themen

Neue Themen


Oben