Swing Erstmaliges setVisible - Verständnisfrage

Status
Nicht offen für weitere Antworten.

hdi

Top Contributor
Hi Jungs,

ich hab in meiner App nen Button der einen Dialog anzeigt. In dem Dialog werden ein paar Kuchendiagramme angezeigt, ich verwende dafür die jFreeChart Lib, falls die jmd kennt.
Auf jeden Fall ist es so dass beim erstmaligen Anzeigen des Dialogs dieser sehr lahm aufgebaut wird.

Jaja ich weiss ich hab's mit meinen komischen Beschwerden über Swing ;) Aber ich will's verstehen.
Denn wenn ich den Dialog schließe und wieder öffne, ist er sofort da.

Ich verstehe das nicht da jedesmal das gleiche passiert. Es ist nicht so, dass ich beim ersten mal mehr Berechnungen mache als bei allen anderen Malen. Ich hab mich schon immer gefragt wieso das so ist.

Wieso zeigt er mir den Dialog nicht erst an, wenn er 100% gerendert ist? Also ich meine intern, wenn er die Infos über alle Pixel hat. Das Schalten von LED's selber geht ja zack zack. Das gilt in Swing schönerweise für die Komponenten in einem Frame/Dialog, aber leider nicht für das Fenster selber. Denn wie schon neulich ist es so, dass ich für ca. ne viertel Sekunde den Rahmen des Dialogs sehe, ohne Inhalt. Beim Rechnern in der Arbeit (ein etwas älteres Teil, ich glaub P4 3.2 Ghz oder so) dauert es sogar ne gute halbe Sekunde. Ich würd ja inzwischen meinen Mund schließen wenn es immer so wäre und Swing einfach als lahm bezeichnen. Aber das ist ja nur beim ersten Anzeigen des Dialogs der Fall.

Frage: Kann man nicht irgendwie diese Initialisierung erzwingen bevor das tatsächliche setVisible kommt? Irgendeine Art Pre-Rendering oder sowas? Wer versteht was da passiert, wieso ist das beim ersten mal langsamer?

Ich dachte auch schon vllt liegt es an den Charts, vllt sind die einfach nicht so performant zu zeichnen. Aber bei jedem Klick auf den Button werden die Diagramme entfernt, Daten neu berechnet, und neue Diagramme (new) in den Dialog geaddet. Also kann es ja doch irgendwie nicht an den Diagrammen selber liegen. Entweder er hat irgendwas gechached, wobei ich nicht verstehen würde wie, weil die Diagramme anders ausehen, oder beim ersten setVisible einer bestimmten Komponente muss er irgendwelche rechenintensiven Dige tun aus irgendeinem Grund?! Wer kann mir helfen, der Rest meiner GUI ist jetzt recht flott und alles super, aber diese eine Sache wurmt mich noch.

Danke
 

Marco13

Top Contributor
Du weißt, solche Ferndiagnosen sind schwierig, aber ... darum von mir nur eine ziemlich nebulös-undfindierte Frage: Hast du auf dem JDialog, der da angezeigt werden soll, mal "dialog.pack()" aufgerufen, bevor du "dialog.setVisible(true)" machst?
 

hdi

Top Contributor
ja pack wird ausgeführt nachdem ich alles adde. Danach noch ein setLocationRelativeTo(myFrame)
 

javimka

Top Contributor
Könnte es ein Lazy-Initialitaion-Effekt sein? Möglicherweise werden gewisse statische Objekte erst beim ersten Zugriff auf die Klasse instanziert und sind dann für alle weiteren Verläufe permanent vorhanden. Vielleicht macht jFreeChart sowas.
 

hdi

Top Contributor
Ne auch nicht, da ich schon beim Programmstart mal meine Instanz erzeugt hab (ist n Singleton), und auch die Methode aufgerufen hab, die vor einem setVisible aufgerufen wird.
 

hdi

Top Contributor
edit: Dööööö...zurück..
Alles was unten steht stimmt, aber ich hab mich von den schönen sysouts beirren lassen: Es sind zwar jetzt ca 80ms schneller, aber daran liegt es doch nicht. Das hat damit nämlich scheinbar nix zu tun, denn manchmal messe ich auch nicht beim ersten Aufruf über 50ms, und der Dialog ist trotzdem sofort da. Am Anfang braucht er jetzt nur 20, aber trotzdem ist es viel langsamer...

Hab die Lösung gefunden: Wenn mich nicht alles irrt, dann liegt es an der JFreeChart Bibliothek.

Für alle die das verwenden möchten: Beim erstmaligen Aufruf von:
-ChartFactory.createPieChart3D
-new ChartPanel(...)
-(und wahrscheinlich noch von anderen oder ähnlichen Methoden/Klassen)

benötigt die Bibliothekt etwa 10 mal so lange wie bei allen folgenden Aufrufen. Anscheinend werden da ziemlich viele Initialisierungen vorgenommen wenn man die Klassen erstmalig nutzt.

Ich hab das Problem jetzt so gelöst dass ich beim Programmstart, als erste Zeile in der main(), mir irgendeinen Fake-Pie erstelle. Den zeig ich natürlich nicht an aber er stösst die Initialisierungen an.

Ich konnte bisher noch nicht alle Initialisierungen anstossen, denn es dauert beim ersten Aufruf meines Dialogs noch immer ca 10ms länger als normalerweise.

Aber ich hab's jetzt geschafft von gut 100 ms beim ersten Aufruf auf 20 ms zu kommen - alle weiteren Aufrufe benötigen meistens ca 10 ms, manchmal aber auch wieder 30 oder 50, warum auch immer, passiert aber sehr selten.
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Seltsame Exception bei setVisible(true) Methode in einem JFrame AWT, Swing, JavaFX & SWT 2
K Swing AWT-EventQueue-1 java.lang.NoClassDefFoundError bei setVisible(true) AWT, Swing, JavaFX & SWT 3
A Swing Buttons werden trotz setVisible nicht dargestellt AWT, Swing, JavaFX & SWT 14
S JFrame -> setVisible AWT, Swing, JavaFX & SWT 3
G Swing Setvisible problem AWT, Swing, JavaFX & SWT 1
1 Problem mit setVisible AWT, Swing, JavaFX & SWT 11
P jframe setVisible(false) wieder sichtbar machen? AWT, Swing, JavaFX & SWT 4
H Swing Keine Rückmeldung (freeze) bei setVisible(false) oder dispose() AWT, Swing, JavaFX & SWT 4
M Kein resize nach Component.setVisible() AWT, Swing, JavaFX & SWT 2
G Swing Wieso braucht man nach setVisible mal ein revalidate und mal nicht? AWT, Swing, JavaFX & SWT 8
B GlassPane setVisible(true) funktioniert nicht AWT, Swing, JavaFX & SWT 2
R Button soll nach dem er gedrückt wurde auf setVisible(false) gestellt werden. AWT, Swing, JavaFX & SWT 3
P Was tun HIDE_ON_CLOSE und setVisible() tatsächlich? AWT, Swing, JavaFX & SWT 7
V JTextField nimmt keine Eingaben an, nach nachträglichem setVisible des JWindows AWT, Swing, JavaFX & SWT 4
L Swing setVisible(false) bei GridBagLayout - wie Layoutverschiebung verhindern? AWT, Swing, JavaFX & SWT 2
L SWT Control.setVisible? AWT, Swing, JavaFX & SWT 2
M Swing JScrollPane und setVisible AWT, Swing, JavaFX & SWT 2
L mehere JPanels auf JFrame - setVisible() funktioniert nicht AWT, Swing, JavaFX & SWT 3
T setVisible()-Aufrufe werden zu spät umgesetzt AWT, Swing, JavaFX & SWT 6
L Problem mit "setVisible" unter LINUX AWT, Swing, JavaFX & SWT 5
K JDialog - Methode nach setVisible() aufrufen AWT, Swing, JavaFX & SWT 4
B alternative zu setVisible() AWT, Swing, JavaFX & SWT 2
C JWindow.setVisible(true) dauert ewig AWT, Swing, JavaFX & SWT 7
F LayoutManager und Component.setVisible(boolean) AWT, Swing, JavaFX & SWT 2
E Hilfe - setVisible macht was es will AWT, Swing, JavaFX & SWT 7
R TextField bringt NullPointerException bei setVisible() AWT, Swing, JavaFX & SWT 12
S Ganze Fenster auf setVisible(false) setzen AWT, Swing, JavaFX & SWT 2
T Problem mit setVisible AWT, Swing, JavaFX & SWT 4
G JavaFX Verständnisfrage mit parametrisierten Methoden und FXML AWT, Swing, JavaFX & SWT 21
B JavaFX Verständnisfrage EventHandler<ActionEvent> Implementierung in meiner Klasse AWT, Swing, JavaFX & SWT 2
B JavaFX Grundlegende Verständnisfrage JavaFX<->Scene Builder AWT, Swing, JavaFX & SWT 12
L JavaFX Verständnisfrage zu JavaFX FXML und Controller-Klasse AWT, Swing, JavaFX & SWT 1
M Swing JButton-Konstruktor Icon-Parameter (Verständnisfrage) AWT, Swing, JavaFX & SWT 7
S Verständnisfrage EventListener AWT, Swing, JavaFX & SWT 6
S Verständnisfrage anonye Klasse ActionListener AWT, Swing, JavaFX & SWT 4
E EINFACHE Verständnisfrage zu repaint(), paintComponent(), usw. AWT, Swing, JavaFX & SWT 16
hdi Verständnisfrage: Container vs. Component AWT, Swing, JavaFX & SWT 3
V Verständnisfrage: Welche Positionierungskonstanten? AWT, Swing, JavaFX & SWT 4
V Verständnisfrage Text und anschließende Bildausgabe? AWT, Swing, JavaFX & SWT 6
R Verständnisfrage BufferStrategy: g.dispose() AWT, Swing, JavaFX & SWT 3
K Verständnisfrage zum CellRenderer AWT, Swing, JavaFX & SWT 4
A Verständnisfrage zur Ereignisbehandlung AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen


Oben