# Swing Komponente mit jogl



## sibianu (5. Feb 2010)

Hallo, kann man irgendwie alle swing-Komponente mit Hilfe von opengl (jogl) zeichnen? Ich habe das Problem, dass ich manchmal sehr viele Panels hin und her bewegen muss und langsam kommt Java an ihre Grenzen so dass es anfängt zu ruckeln.
Ich habe auch swogl gefunden, hat aber nicht wirklich geklappt. Erstens bekam ich mein Panel nicht richtig angezeigt und zweitens waren die Bewegungen noch langsamer als vorher. Ausserdem unterstützt swogl nur jogl1.1
Ich suche also irgendwas womit ich das Zeichnen beschleunigen kann, da ich sehr viele und sehr komplexe java-Komponenten benutze.

Danke im voraus,
sibianu


----------



## Marco13 (5. Feb 2010)

Swogl ist auch nicht dafür gedacht, "mehr" Components darstellen zu könnten (als mit 2D) oder die Components "effizienter" darstellen zu lassen (als mit 2D) - sondern eben um Components in 3D darstellen zu können. 

Um mal eine grobe Vorstellung zu bekommen: Wie viele Stellen hat die Zahl deiner Panels?


----------



## sibianu (8. Feb 2010)

Ich denke mal es bleibt gerade noch so im s-stelligen Bereich. Das Problem dabei ist, das ich jetzt ein paar Animationen eingebaut habe wo sich fast alle Panels auf einmal bewegen müssen und dann werden natürlich bei jedem Animation-Schritt alle repaintet. Obwohl mein Rechner recht performant ist fängt es an zu ruckeln, das Program soll aber auch auf schwächere Rechner laufen.

Gruß,
sibianu


----------



## Marco13 (8. Feb 2010)

Wofür steht "s"? Es ist noch ziemlich unklar, worum's da geht...


----------



## sibianu (9. Feb 2010)

Oh, entschuldigung. Ich meinte, dass ich gerade noch in den 2-stelligen Bereich bleibe, kann allerdings auch weit drüber gehen. Die Probleme mit dem Ruckeln habe ich denke ich mal schon im 2-stelligen Bereich


----------



## Marco13 (9. Feb 2010)

Das "...worum es da geht" bezog sich z.B. auf die Frage, ob das alles eigene JPanels sein müssen, oder ob man nicht (wie etwa bei CellRenderern) einen "Stempel" dafür verwenden kann und so...


----------



## sibianu (9. Feb 2010)

Öhm, ich befürchte es müssen JPanels sein, es sind mehrere komplett verschiedene Komponente die JPanels beinhalten. Stell dir zum Beispiel einen Desktop vor wo mehrere Programme angezeigt werden. So sieht das Programm aus. Jetzt habe ich an der Seite einen ausklappbaren Menü, der beim Öffnen den ganzen Arbeitsbereich mit verschiebt, sprich die ganzen offenen Programme gleich mit. Durch das Verschieben des Hauptpanels müssen also bei jedem Schritt wo das Menü aufklappt auch alle Programme neu repaintet werden. Diese Programme können sehr einfach sein, mit nur 2-3 Panels, können aber auch sehr kompliziert aufgebaut werden und sehr viele Komponenten beinhalten.
Das mit dem Stempel habe ich ehrlich gesagt nicht verstanden, das klang aber so, als müsste man dafür die Panels ersetzen, was ich mir momentan leider sehr schwer vorstellen kann.

Gruß,
Sibianu


----------



## Marco13 (9. Feb 2010)

Das mit dem "Stempel" war eine Anlehnung an sowas wie das "ListCellRenderer" interface. Wenn man eine JList mit 1000 Einträgen hat, dann enthält die nicht 1000 Unter-Components, sondern nur EINE Component, die verwendet wird, um ALLE 1000 Einträge auf den Bildschirm zu malen.

Das passt bei dir jetzt evtl. nicht.

Eigentlich würde ich sagen: Ja, wenn man ein kompliziertes Programm mit SEHR vielen Components hat, dann WIRD das eben langsam... aber das ist eher eine Ausflucht, weil ich mir nicht vorstellen kann, wie man das "einfach so" schneller machen könnte....


----------



## Kr0e (9. Feb 2010)

Ein altbekanntes Problem, nicht war Marco13 ?  (Swogl ist trotzdem cool )

@ sibianu:

Nimm eine 3D Gui wie FengGUI oder TWL. ICh hab mir auch daran die Zähne ausgebissen. Swing ist einfach für Java2D und egal was man macht, es wird nie so schnell sein (Nichtmal annähernd) wie java2d.

3DGui's sind in OpenGL geschrieben, komplizierter zu benutzen, meist ohne GUI-Editor und nebenbei meist noch in einem Betastadium.
Es gibt einfahc noch keine perfekte lösung dafür.

Gruß,
Chris


----------



## sibianu (10. Feb 2010)

Meine Idee war, dass wenn ich die Komponenten mit opengl zeichne das alles schneller wird. Ich weiss, das ist eher für 3D Anwendungen gedacht, aber man kann ja auch 2D im 3D zeichnen sozusagen.  Die Idee war, dass sich Java nicht mehr soviel mit dem Zeichnen beschäftigt, wei da die meisten Resourcen verloren gehen.


----------



## Marco13 (10. Feb 2010)

Ich kann mir immernoch nicht vorstellen, wo und wie man SO viele Components zeichnen können will, dass es unterträglich langsam wird - d.h. vorstellen kann  ich mir das schon, aber keinen Zusammenhang, in dem das "sinnvoll" wäre. Kannst du einen Screenshot posten?


----------



## sibianu (10. Feb 2010)

Das ist ein Printscreen. Ich habe in meinem Program 3 andere Programme offen, manche davon beinhalten sehr viele Komponenten. Man könnte aber beliebeig viele Programme öffnen.
Mein Problem zur Zeit ist nur, wenn ich das Menü an der Seite auf und zuklappe bewegen sich die Programme mit (das ist erstmal so gewollt). Klar, man könnte das Menü auf dem Hauptpanel machen und nicht nebendran, das ist aber erstmal nicht gewollt, sondern man soll die laufenden Programme nicht mit dem Menü überdecken.
PS: Den Menü oben bitte erstmal nicht kritisieren, das sind nur ein paar Tests wie man grössere Buttons machen kann und mit Vector-Icons bestückt.


----------



## Kr0e (10. Feb 2010)

Hi, also um das mal klar zustellen! Du willst das nur benutzen um es zu beschleunigen ?

Dann versuch dein Glück mit -Dsun.java2d.opengl=True (True mit Debug in der konsole, true für simples Aktivieren)
Dieser Befehl muss unter VM Options eingetragen werden. Du sagst damit Java, dass es opengl zum rendern nehmen soll.
Damit ist das um einiges fixer.

Ich kann mir schon vorstellen, dass das langsam wird. Du benutzt ja offentsichtlich JDesktopPane. Wenn dort viele Fenster mit komplerxen componenten gemalt werden müssen, kann das ziemlich in den Keller gehen.

Gruß,
Chris


----------



## sibianu (10. Feb 2010)

Das habe ich leider schon probiert, es sind manchmal ein paar Verbesserungen zu sehen, aber auch nicht immer. Manchmal sieht man auch überhaupt keinen Unterschied. Auch wenn man das Glück hat und es scheint etwas schneller zu laufen, bei 2-3 grössere Programme geht das auch in die Knie und es fängt an richtig zu flackern.


----------



## Kr0e (10. Feb 2010)

Hmm, also mir is das auch schonmal aufgefallen dass das unter umständen etwas löangsam werden kann...
Aber nie so, dass ichs nicht gebrauchen konnte oder so. Du machst doc hhoffentlich keine Berechnungen innerhalb der Swing Eventqueue oder ?


----------



## sibianu (10. Feb 2010)

Nein, im Gegenteil, wir haben viele Sachen von der AWT-Eventqueue ausgelagert um die zu befreien. Allerdings haben wir an manche Stellen Berechnungen in den Paintroutinen, das lässt sich aber nicht vermeiden für manche Sachen.


----------



## sibianu (15. Feb 2010)

Würde es vielleicht sin machen sowas wie einen PrintScreen vom HauptPanel zu machen und nur den bei der Verschiebung anzeige? Im Hintergrund könnte ich alle Komponenten von A nach B in einem Schritt verschiebe, ohne Animation.


----------



## Marco13 (15. Feb 2010)

Das könnte schneller sein... Aber auch ein bißchen fummelig, bis es richtig läuft...


----------



## sibianu (26. Feb 2010)

Also das ersetzen lief ohne Probleme, allerdings habe ich dadurch ein anderes Problem:
wenn mein Menü aufgeklappt ist, dann hat mein Hauptfenster eine Breite x. Wenn ich jetzt ein Image von dem Hauptfenster mache und das Hauptfenster damit ersetze fehlt mir beim zuklappen ein Stück, und zwar genau die Breite des Menüs.
Ich habe versucht ein Viereck im Hintergrund zu malen, der größer ist als das Bild, das funktioniert auch gar nicht so schlecht, da ich aber auf im Hautfenster mittlerweile verschiedene Verläufe und Schattierungen habe bekomme ich das auf dem fehlenden Stück nicht 100%ig hin. Ich habe den Verlauf ganz gut hinbekommen, aber die Schattierung ist etwas komplizierter, auch weil ich die Paint-Routine übermalt habe.
Ein andere Idee war das Bild zu strecken bis ich das wieder mit dem Originalfenster austausche, das würde aber heissen, dass ich die Programme, die sich dadrauf befinden, auch mitstrecke, und das würde etwas bescheuert aussehen. 
Hat jemand vielleicht eine andere Idee wie ich das fehlende Teil eleganter ausstopfe?

Gruß,
Sibianu


----------

