Falsches Rendern durch JCheckBox in eigenem JTree

JavaMichael

Aktives Mitglied
Hallo,

da ich im Anfängerforum keine Hilfe gefunden habe, schreibe ich noch einmal, aber nun
in diesem Unterforum.

Folgende Situation:

Ich habe eine eigene Variante von einem JTree entwickelt. Diese hat aber leider ein starkes
optisches Problem (siehe Bilder). Wenn man auf die freie Fläche eines Knotens drückt, dann
wird alles normal gezeichnet (siehe Bild 1). Wenn man aber auf die im Knoten enthaltene
JCheckBox klickt, dann drängt sich diese zusammen mit dem Knoten in den Vordergrund,
sodass die Reihenfolge auf der Z - Achse verfälscht wird (siehe Bild 2).

Dazu habe ich die Theorie, dass die CheckBox sich in dem JLayeredPane des JFrames immer
in den Vordergrund drängen will und somit auch das JPanel, welches einen Knoten optisch
repräsentiert mit zieht.

1) Stimmt meine Theorie ?
2) Wenn ja, wie kann ich verhindern, dass sich die JCheckBox immer in den Vordergrund drängt ?
3) Sollte ich innerhalb von dem JTree ein eigenes JLayeredPane verwenden ?

Viele Grüße,

Michael
 

Anhänge

  • Bild1.png
    Bild1.png
    18,4 KB · Aufrufe: 22
  • Bild2.png
    Bild2.png
    22,2 KB · Aufrufe: 19
Um das ganze mit NetBeans auszuführen, startet man die Datei "JWorldTreeTesting" im Paket "default package" der
Testpakete.

Ansonsten bin ich beim Programmieren ein mäßig erfahrener Einsteiger. Wenn euch sonst irgendetwas auffällt, mit dem
ich mein Programmieren verbessern kann, dann teilt mir dies bitte mit.
 

Anhänge

Zuletzt bearbeitet:
Oje, da hast Du Dir ja was aufgehalst; eine komplett eigene Swing-Komponente mit angepasstem Look and Feel und das auf Basis von JTree, einer nicht gerade trivialen Komponente...

Da werde ich nicht weiter einsteigen, da ich keine Lust habe, mich durch tausende Zeilen JDK-Code zu quälen, aber prinzipiell dürfte das Problem bestehen, dass Dein Editor die gleiche Komponente verwendet, wie Dein Renderer, also ein entsprechend großes Panel mit Hintergrundfarbe. Gib da einfach mal eine JCheckBox zurück.
 
Ich danke dir dennoch für deine Hilfe. Jeder noch so kleine Hinweis kann mich da schon weiter bringen, da ich auch schon
seit Stunden herumüberlege.

Was hältst du prinzipiell von meiner Alternative, den JTree über eine JLayeredPane zu rendern ?

Ansonsten habe ich bei dem Editor deinen Rat befolgt, dort eine JCheckBox zu verwenden und nun verhält sich der JTree tatsächlich
etwas mehr, wie ich es gerne hätte. Kannst du mir kurz umreissen, woran das liegen könnte oder an welcher Stelle in den JavaDocs
man soetwas nachlesen kann ?

Vielen Dank,

Michael
 
Zuletzt bearbeitet:
Das hatte ich oben eigentlich schon geschrieben:
prinzipiell dürfte das Problem bestehen, dass Dein Editor die gleiche Komponente verwendet, wie Dein Renderer, also ein entsprechend großes Panel mit Hintergrundfarbe.

Beim Rendern wird Dein Baum von "hinten nach vorne" gezeichnet (das ist Folge dessen, dass die Knoten der Reihe nach gezeichnet werden), was auch so gewünscht ist. Der Editor liefert dagegen eine Komponente, die im JTree als Kindkomponente platziert wird und sich somit im Vordergrund befindet. Dabei hast Du halt nochmal das halbtransparentes Panel drübergebügelt, das Du bereits zum Zeichnen der Knoten verwendet hast. Dadurch entsteht dieser Effekt.

Das ist das Standardverhalten von Swing: paint() zeichnet erst die Komponente selbst, dann die Kindelemente des Containers (eine Swing-Komponente ist auch immer ein Container).

Hier steht was dazu: https://docs.oracle.com/javase/tutorial/uiswing/painting/closer.html

Was hältst du prinzipiell von meiner Alternative, den JTree über eine JLayeredPane zu rendern ?
Wüsste ad hoc nicht, wie das funktionieren und was das bringen sollte.
 

Neue Themen


Zurück
Oben