Leider fiel mir keine andere Überschrift ein. Also das folgende ist sehr weit hergeholt und ich bezweifle auch dass das geht aber naja.
Swing benutzt intern ja das Konzept des MVC’s. Nachdem ich nun eigene Swing Komponenten geschrieben habe(am Anfang habe ich meistens die paintComponent Methode überschrieben um schnell was zu haben und später habe och dann eine passende UI Klasse erstellt), ist mur beim Testen was aufgefallen.
Wenn man ein 3PartyLnF antiviert(habe das SeaGlassLookAndFeel genommen), dann passiert es öfters, dass die Komponenten nicht so aussehen wie sie von SeaGlass gedacht waren. Hört sich komisch an und ist auch doof erklärt. Gemeint ist, dass man ja das UI überschreibt und aomit nicht das vom LnF benutzt wird.
Bei SeaGlass ist es nun so, dass eine JTextArea eine Art Linierung kriegt, die die einzelnen Zeilen wie bei einem College Block trennt. Benutze ich ein eigenes UI, dann erscheinen eben diese Linien nicht(eigentlich logisch).
Nun habe ich aber eine Komponente, die nur eine eigene UI kriegt, weil ich eine eigene View auf einer JTextArea setzen wollte(da JTextArea keine Methode wie setView besitzt muss man es eben so machen). Dadurch entfällt der coole andere Kram vom LnF.
Meine Frage nun:
Ist es möglich zur Laufzeit zu untersuchen welches LnF aktiv ist, dann die passende UI für die Komponente suchen und dann seine selbsterstellte dynamisch von ihr erben zu lassen, damit die anderen Sachen auch dabei sind wie eben diese Linien. Dazu müsste man halt auch gucken ob die Klasse und die Methode nicht final sind, aber das ist wahrscheinlich eines der kleinsten Probleme. Falls die Klasse bzw die Methode nicht erweiterbar ist, dann soll die UI Klasse halt von der BasicUI erben.
Hoffe ihr habt alles verstanden. Ist schon eine kompleze und schwer zu erklärende Problematik
Ich freue mich auf jegliche Anregung und bei evt. Fragen nicht schüchtern sein ^^
Solange du dich nicht auf solche Dinge wie NiXPhoE einlässt, ist eigentlich alles im (verdammt wenn er das nur wüsste :lol:) grünen Bereich. Durch das Überschreiben von “paintComponent()” gestaltest du das LnF einer Component nun mal selber und mit dem Aufruf “super.paintComponent()” kannst du dafür sorgen, dass evtl. vorhandene LnF-Parts für deine Komponente gezeichnet werden. LnFs lassen sich natürlich nur für vordefinierte Komponenten wie Buttons, Slider usw. erstellen. Selbsdefinierte (wie z.B. meine AudioScopes, siehe Anhang) lassen sich nur durch “super.paintComponent()” anpassen.
Ihr kennz doch alle SwingX oder? Dort hat ja auch jede Komponente seine eigene UI Klasse, zB JXButtonUI. LnFs haben dies ja auch(zB MetalButtonUI).
Ich habe jetzt auch eigene Komponenten geschrieben mir einer eigenen UI Klasse, die das Zeichnen und all den Kram übernimmt(zB bei JXHeader wird so sas Icon richtig gezeichnrt). Meine Frage war halt, ob es möglich ist, diese sepbsterstellten UI Klassen com aktiven LnF erben zu lassen. Angenommen ich habe einen eigenen Button mit seiner eigenen UI Klasse. Wenn das das Substance LnF an ist, soll die UIKlasse des Buttons von der UI Klasse die Substance bereitstellt erben, damit halt die ganzen Funktionen dabei sind die Substance bereitstellt(also das Aussehen dann). Diese UI Klasse soll dann nur das neu Zeichnen, das er sie auch will und den Rest seinem Parent(also den Substance Teil ) überlassen. @Spacerat
Ich überschreibe ja nie paintComponent, da jede Klasse ihre eigene UI Klasse hat. Rufe nur setUI auf.
Hoffe mal ihr habt das verstanden, iat echt schwer zu erklären.
[QUOTE=groggy]Hoffe mal ihr habt das verstanden, iat echt schwer zu erklären.[/QUOTE]Werden UIs nicht durch ein LnF definiert? Was soll ein LnF denn machen (wie soll es die Elemente darstellen) wenn ein spezielles UI gar nicht definiert wurde?
@Spacerat
Ich kann bei einer Komponenten aber auch ein selbst erstelltes UI setzen und dies gilt dann immer! Zum Beispiel erben meine von Basic…UI. Nur sollen siese zur Laufzeit nicht von Basic…UIerben sondern von der spezifischen UI des LnF und nur dann ihre Zeichenroutinen oder ihre übers hriebenen Methoden ergänzen.
JEditorPane (und JTextpane erbt ja davon) hat einen EditorKit, der wiederum hat eine gewisse ViewFactory welche eben für jedes Textelement eigene Views erstellt. Auf der Seite wird das alles sehr detailliert beschrieben.
zu erst registrierst du deine UI-Klasse zu einem bestimmen UI-Klassennamen: javax.swing.UIManager.put("MultiLineRadioButtonUI_ID", MultiLineRadioButtonUI.class.getName());
die MultiLineRadioButtonUI erbt dabei von javax.swing.plaf.ComponentUI und benötigt eine statische Methode public static ComponentUI createUI(final JComponent comp) welche eine neue Instanz ihrer selbst zurückliefert return new new MultiLineRadioButtonUI((XYZButton) comp)