Hi liebe Leute,
ich hoffe Ihr könnt mir einen Denkanstoß für mein Performanceproblem geben, ich weiß nämlich langsam nicht mehr weiter.
Ich habe ein JPanel mit einem CardLayout. Dieses beherbergt zwei JPanel als "Seiten". Panel1 wird zur Suche und Anzeige der Suchergebnisse benutzt, Panel2 beinhaltet die Anzeige der detailiierten Informationen zu einem Suchergebnis.
Nach der Suche und Selektion auf Panel1 kann der Benutzer einen Button drücken, der quasi das Blättern auf die zweite Seite (also Panel2) ermöglicht. Dies wird realisiert, indem zunächst in einem Workerthread die Daten zu dem selektierten Suchergebnis aus der Datenbank gelesen, und diese dann im Anschluss über das CardLayout zur Anzeige gebracht werden.
Das Problem ist nun, dass ein Teil der Detailinformationen in einer JTabbedPane angezeigt werden soll, die dynamisch anhand der gefundenen Informationen mit Tabs gefüllt werden soll. Dh. wenn die Suchdaten 20 Abschnitte enthalten, muss die JTabbedPane dynamisch mit 20 Tabs versehen werden zur Laufzeit, genauer gesagt zwischen dem Laden der Infos und dem Anzeigen der zweiten Seite.
Mein Problem ist jetzt nicht das grundsätzliche Multithreading. Der Ladevorgang ist in einem Workerthread und funktioniert. Aber das Anzeigen der geladenen Daten dauert viel zu lang.
Dabei scheint das Problem nicht die Erzeugung der JPanel (als Container für den Inhalt der Tabs) und ihrer Komponenten zu sein, sondern vielmehr das panel.add() der einzelnen Unterpanel.
Ich habe per Microbenchmarking mal schlicht die Tabs inklusive ihrer Panel erzeugt und bin bei ca 1,3 Sekunden für das Umblättern gewesen (ja immer noch nicht schnell aber für die verarbeiteten Datenmengen annehmbar). Wenn ich nun die bereits erzeugten Panel zum Container-Panel in den einzelnen Tabs per add() hinzufüge, dauert derselbe Blättern-Vorgang 17 Sekunden...
Hat jemand eine Idee wie ich dieses Verhalten umgehen kann? Ich habe schon an eine Art lazy-Initialsierung der einzelnen Tabs gedacht, also erst alle Tabs leer hinzufügen (abgesehen vom ersten der angezeigt wird), dann umblättern und dann quasi im Hintergrund die Tabs weiter mit Komponenten füllen lassen. Aber das würde quasi bedeuten, dass ich die Panel ausserhalb des EDT erzeugen und hinzufügen müsste, was meinem Verständnis von Swing entgegen liefe...
Der eigentliche Inhalt der einzelnen Reiter wird bereits über einen PropertyChangeListener auf der JTabbedPane aktualisiert (also die Daten). Wenn ich an dieser Stelle versuche auch das Panel zur Anzeige der Daten im Tab zu initialisieren, dauert der Tabwechsel allerdings zu lang, und es gibt an dieser Stelle einen kurzen Freeze...
Es tut mir leid, dass ich nicht wirklich mit Code aufwarten kann, aber das wären leider etwas viele Klassen für Panel, Actions etc die ich dann hier posten müsste.
ich hoffe Ihr könnt mir einen Denkanstoß für mein Performanceproblem geben, ich weiß nämlich langsam nicht mehr weiter.
Ich habe ein JPanel mit einem CardLayout. Dieses beherbergt zwei JPanel als "Seiten". Panel1 wird zur Suche und Anzeige der Suchergebnisse benutzt, Panel2 beinhaltet die Anzeige der detailiierten Informationen zu einem Suchergebnis.
Nach der Suche und Selektion auf Panel1 kann der Benutzer einen Button drücken, der quasi das Blättern auf die zweite Seite (also Panel2) ermöglicht. Dies wird realisiert, indem zunächst in einem Workerthread die Daten zu dem selektierten Suchergebnis aus der Datenbank gelesen, und diese dann im Anschluss über das CardLayout zur Anzeige gebracht werden.
Das Problem ist nun, dass ein Teil der Detailinformationen in einer JTabbedPane angezeigt werden soll, die dynamisch anhand der gefundenen Informationen mit Tabs gefüllt werden soll. Dh. wenn die Suchdaten 20 Abschnitte enthalten, muss die JTabbedPane dynamisch mit 20 Tabs versehen werden zur Laufzeit, genauer gesagt zwischen dem Laden der Infos und dem Anzeigen der zweiten Seite.
Mein Problem ist jetzt nicht das grundsätzliche Multithreading. Der Ladevorgang ist in einem Workerthread und funktioniert. Aber das Anzeigen der geladenen Daten dauert viel zu lang.
Dabei scheint das Problem nicht die Erzeugung der JPanel (als Container für den Inhalt der Tabs) und ihrer Komponenten zu sein, sondern vielmehr das panel.add() der einzelnen Unterpanel.
Ich habe per Microbenchmarking mal schlicht die Tabs inklusive ihrer Panel erzeugt und bin bei ca 1,3 Sekunden für das Umblättern gewesen (ja immer noch nicht schnell aber für die verarbeiteten Datenmengen annehmbar). Wenn ich nun die bereits erzeugten Panel zum Container-Panel in den einzelnen Tabs per add() hinzufüge, dauert derselbe Blättern-Vorgang 17 Sekunden...
Hat jemand eine Idee wie ich dieses Verhalten umgehen kann? Ich habe schon an eine Art lazy-Initialsierung der einzelnen Tabs gedacht, also erst alle Tabs leer hinzufügen (abgesehen vom ersten der angezeigt wird), dann umblättern und dann quasi im Hintergrund die Tabs weiter mit Komponenten füllen lassen. Aber das würde quasi bedeuten, dass ich die Panel ausserhalb des EDT erzeugen und hinzufügen müsste, was meinem Verständnis von Swing entgegen liefe...
Der eigentliche Inhalt der einzelnen Reiter wird bereits über einen PropertyChangeListener auf der JTabbedPane aktualisiert (also die Daten). Wenn ich an dieser Stelle versuche auch das Panel zur Anzeige der Daten im Tab zu initialisieren, dauert der Tabwechsel allerdings zu lang, und es gibt an dieser Stelle einen kurzen Freeze...
Es tut mir leid, dass ich nicht wirklich mit Code aufwarten kann, aber das wären leider etwas viele Klassen für Panel, Actions etc die ich dann hier posten müsste.