Keine Transparenten JTextComponents möglich mit Nimbus L&F?

Fu3L

Top Contributor
Hallo,

ich erstelle ein Programm, das ein transparentes JTextArea enthalten soll, da dieses den gleichen Hintergrund, wie der Rest des Fensters haben soll (gekacheltes Tile).

Der Konstruktor des JPanels sieht so aus:

[Java]

this.setBackground(Color.BLACK)

txt = new JTextArea(9, 66);
txt.setText("lala\nlala\nlala\nlala\nlala\nlal");

txt.setOpaque(false);
txt.setEditable(false);

scroll = new JScrollPane(txt);
scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
scroll.setBorder(BorderFactory.createEmptyBorder());
scroll.setOpaque(false);
scroll.getViewport().setOpaque(false);
this.add(scroll);[/code]

Ich habe mit dem Nimbus L&F so keine Transparenz des Fensters zustande gebracht, auch mit einer Stunde suchen hier im Forum. Erst als ich wieder normal das Ocean L&F eingestellt habe, wurde das JTextArea transparent.
Ich würde aber ungern auf das Nimbus L&F verzichten, da es mir sehr gefällt und das ganze auch noch für den Kusntunterricht ist, also kommt es auf die Ästhetik an 😉

Ich verwende diese Zeil, um das L&F umzustellen:

Java:
UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
 
Erstmal hier etwas ausführliches zur Materie: Java Nimbus LAF with transparent text fields - Stack Overflow

Dort wird u.a. vorgeschlagen:
Java:
txt.setBorder(BorderFactory.createEmptyBorder());
txt.setOpaque(false);
txt.setBackground(new Color(0,0,0,0));
Die letzte Zeile erzeugt ein Color Objekt mit dem Alphawert 0, also quasi die "Farbe Transparent". An dieser Lösung ist nachteilige, dass scheinbar der Rahmen des ScrollPanes dennoch gezeichnet wird. Jedenfalls als ich es ausprobiert habe.

Also, Nimbus hat so seine Schwierigkeiten, was die Opaque Propertie angeht. Eine Idee wäre, da du das alles schön in einem Konstruktor hast, einfach die gleiche Background Propertie wie die vom Panel zu nehmen. Sprich:
Java:
txt.setBackground(this.getBackground());
Aber nicht die Rahmen vergessen dabei. 😉
 
Danke, zumindest der erste Vorschlag funktioniert bei mir.. Ich werde mir wohl was einfallen lassen, damit die Begrenzung zum Rest des Fensters passt. Da ist es allerdings besser, die Umrandung des Textfeldes zu belassen, da sonst der erste Buchstabe einer Zeile auf dem Border der Scrollpane gezeichnet wird.

Der zweite Vorschlag funktioniert leider nicht, da ich ja ein Hintergrundbild verwende...

Wäre es theoretisch möglich eine eigene Borderklasse abzuleiten, die wirklich respektiert, dass sie "leer" sein soll?^^ (Als Hobby Programmierer hab ich mich nie damit befasst, vorgegebene Klassen zu manipulieren^^)
 
Wäre es theoretisch möglich eine eigene Borderklasse abzuleiten, die wirklich respektiert, dass sie "leer" sein soll?^^ (Als Hobby Programmierer hab ich mich nie damit befasst, vorgegebene Klassen zu manipulieren^^)
Dafür gibt es doch den EmptyBorder. Den sollte man auch immer dann verwenden, wenn man Abstände einfügen will. Über die BorderFactory bekommt man ganz leicht einen.
Code:
BorderFactory.createEmptyBorder(top, left, bottom, right)

Ode rmeinst du was anderes?

BTW: Wenn du dein Programm "stylisch" aussehen lassen willst, dann würde ich dir raten nicht auf Nimbus zu setzen, da Nimbus in vielen Dingen einfach mehr frustet. Schau dir mal z.B. Substance https://substance.dev.java.net/ an. 😉 Oder such dir eines der zahlreichen anderen freien LAFs aus. eine Übersicht findet sich auf Home - javootoo.com Recht nett könnte auch noch Synthetica - Java Look And Feel (dort gibt es sogar direkt für das Arbeiten mit TextAreas in der FAQ was Synthetica - Java Look And Feel) sein, aber das ist mit unter nicht kostenlos.

Na ja, ansonsten, wenn du wirklich ganz individuell was zaubern möchtest, dann gebe es da noch den Weg sich ein ganz eigenes LAF zu basteln. Das kann man entweder von selbst von hand machen (sehr schwierig) oder es etwas leichter haben mit einigen wenigen Einschränkungen über ein Tool wie EaSynth Look And Feel Designer - Java Look And Feel IDE oder Home
 
Zuletzt bearbeitet:
Dafür gibt es doch den EmptyBorder. Den sollte man auch immer dann verwenden, wenn man Abstände einfügen will. Über die BorderFactory bekommt man ganz leicht einen.
Code:
BorderFactory.createEmptyBorder(top, left, bottom, right)

Ode rmeinst du was anderes?

Ich meinte das Problem, dass du selbst angesprochen hast: Dass der Rahmen um die ScrollPane auf einmal sichtbar wird, wenn man das TextArea transparent macht, obwohl ich ja eigentlich den Rahmen der ScrollPane unsichtbar mache. (Darüber ist ja auch auf der Stack Overflow Seite geschrieben worden)
Java:
scroll.setBorder(BorderFactory.createEmptyBorder());
scroll.setOpaque(false);
scroll.getViewport().setOpaque(false);


Was die anderen Look and Feels angeht, werde ich sie mir mal ansehen 🙂
 
Achso, okay. ^^

Im Prinzip könntest du auch eine eigene UI Klasse für deine Scrollpane bauen.

Dafür einfach von der entsprechenden XXXScrollPaneUI Klasse des LAFs (XXX=LafName) ableiten und deine Anpassungen vornehmen. Für Nimbus heißt die entsprechende Klasse javax.swing.plaf.synth.SynthScrollPaneUI.

Am besten schaust du erstmal direkt in die entsprechende XXXScrollPaneUI Klasse rein und liest dir die diversen Kommentare durch, ist manchmal recht hilfreich. Nun Änderungen vornehmen und dann musst du deine fertige UI Klasse nur noch in die richtige Komponente reinpacken mit "setUI(MyScrollPaneUI)".

Wenn deine UI Klasse allerdings weitestgehend LAF unabhängig sein soll, dann erbst du besser von der javax.swing.plaf.basic.BasicScrollPaneUI, (alle LAF bezogen UI Klassen erben übrigens immer von den BasicUI Klassen) aber dafür hast du evtl. einige grafische Bugs je LAF.
 
Zuletzt bearbeitet:

Zurück
Oben