Komponenten anwendugsweit formatieren

Herr Kaiser

Bekanntes Mitglied
Hi Forum,
hier eine Anfängerfrage: ich habe inzwischen recht viele JLabels und JTextfields auf diversen Panels und Tabs in einem Frame untergebracht. Ich möchte dem Anwender die Möglichkeit geben, deren Formatierung (im wesentlichen Schrift und Farben) einheitlich zu verändern. Muss ich hierzu im Code jede dieser Komponenten einzeln anfassen, oder gibt es irgend so etwas wie eine Liste aller im Frame enhaltenen Komponenten, auf die man hierzu zugreifen könnte?
Danke für eure Hilfe!
 

CroniD

Aktives Mitglied
Na ja, jede Klasse, die von "Container" erbt hat die Methode "getComponents()", die dir ein Array von "Component" zurück gibt, die diesem Container mit add() zugeordnet wurden. Jede JComponent (also jede Swing Klasse) hat diese Methode.

Du könntest also mit Hilfe dieser Methode eine rekursive Methode schreiben, die dann die gewünschte Eigenschaften setzt.

Aussehen könnte das zum Beispiel so:
Java:
public final class MySwingUtilities {

	public static interface Changer {
		/**
		 * This method will be invoked, if <code>allowChange(Component)</code> returns <code>true</code>.
		 * 
		 * @param c the <code>Component</code> that should be changed.
		 */
		public void change(Component c);
		/**
		 * This method will check if an <code>Component</code> might be changed.
		 * 
		 * @param c an <code>Component</code> that might be changed.
		 * @return true if the <code>Component</code> should be changed.
		 */
		public boolean allowChange(Component c);
	}

	/**
	 * Change <code>Component</code> recursively. An instance of the <code>Changer</code> Interface
	 * define which components will be changed.
	 * 
	 * @param comp the root <code>Component</code>
	 * @param changer define which <code>Component</code> should be changed
	 * @param changeRoot if true, then the <code>changer</code> try to change <code>comp</code> too
	 */
	public static void changeComponentsRecursively(Component comp, Changer changer, boolean changeRoot) {
		if (comp == null || changer == null) {
			// nothing to do
			return;
		}
		if (changeRoot && changer.allowChange(comp)) {
			changer.change(comp);
		}
		if (comp instanceof Container) {
			for (Component c : ((Container) comp).getComponents()) {
				changeComponentsRecursively(c, changer, true);
			}
		}
	}
}

Hier ein Anwendungsbeispiel: das wechseln der Hintergrundfarbe zur SystemColor.window Farbe für alle JPanel Objekte.
Java:
JFrame content = new JFrame();
// was zum JFrame hinzufügen
MySwingUtilities.changeComponentsRecursively(
			content,
			new Changer() {
				@Override public void change(Component c) {
					c.setBackground(SystemColor.window);
				}
				
				@Override public boolean allowChange(Component c) {
					return c instanceof JPanel;
				}
			},
			true
);

Kleine Anmerkung noch: Jede Swing Klasse erbt von JComponent, diese wiederrum erbt von der AWT Klasse Container, aber nicht jede AWT Component erbt von dieser Klasse. Beispielsweise hat die AWT Klasse Button nicht die Fähigkeit als Container zu fungieren, die JButton Klasse allerdings schon. D.h. also jede Swing Klasse ist ein Container, auch wenn es wenig Sinn macht. Daher sollte man die "allowChange(Component)" Methode besonders dann umfangreicher implementieren, wenn man bei Swing Klassen wie z.B. JButton die Containerfähigkeit benutzt, aber diese Componenten dann wiederum nicht geändert werden sollen. Unter Umständen könnten auch mehrfaches Casten nötig sein. Dann aber den check mit "instanceof" nicht vergessen. ;)

Hoffe das hilft dir weiter. :)
 

Herr Kaiser

Bekanntes Mitglied
Hoffe das hilft dir weiter.

Ja!!!! Super. Genau die Info, die ich gesucht habe. Und der Beispielcode funktioniert prima. Habs auch getestet für JTextfields und JButtons. Nicht funktioniert hat es allerdings mit JLabels. Liegt das an den von dir oben angesprochenen Vererbungsunterschieden?

Herzlichen Dank für deine Hilfe!

EDIT: Wenn ich oben in Zeile 11 die Bedingung "c instance of ..." weglasse und prinzipiell true returne, um alle Komponenten zu berücksichtigen, werden auch die JLabels erfolgreich verändert. (??)
 
Zuletzt bearbeitet:

CroniD

Aktives Mitglied
Ich weiß nun nicht genau was du meinst, aber generell ist es eine gute Idee, wenn die Komponenten, die du ändern willst, bereits angezeigt werden (isVisible() == true) noch ein revalidate() und repaint() bei deinem Top-Level Container hinzufügst. Also i.d.R. bei deinem Frame Objekt.

Und wenn du bei der "allowChange(Component)" immer true zurück gibst, dann ändert er natürlich alle. ;)
 

Herr Kaiser

Bekanntes Mitglied
generell ist es eine gute Idee, wenn die Komponenten, die du ändern willst, bereits angezeigt werden (isVisible() == true) noch ein revalidate() und repaint() bei deinem Top-Level Container hinzufügst. Also i.d.R. bei deinem Frame Objekt.

Das hat leider nicht funktioniert. Da mein Fenster inzwischen eine sehr verschachtelte Angelegenheit aus mehreren Containern ist, habe ich auch versucht, zu allen übergeordneten Containern und nicht nur für das Top-Level Frame revalidate und repaint hinzu zu fügen. Das hat nichts gebracht. Interessanterweise werden die Labels automatisch mitverändert, wenn ich alle Panels verändere. Die mit den Labels im gleichen Panel liegenden Checkboxen allerdings bleiben unverändert. Vermutlich versteckt sich hinter dieser Ungleichbehandlung irgend eine systematische Logik, die ich noch nicht überblicken kann. Ist aber kein akut dringliches Problem, da ich ja jetzt weiß, wie ich alle Komponenten in einem Rutsch anpassen kann.:)

Danke für deine Hilfe! :):)
 

fastjack

Top Contributor
Zumindest wären mal Factory-Methods für Buttons und Labels und Co. eine gute Wahl. Dann hast Du schonmal die Erzeugung von diesen Komponenten zentralisiert, kannst Farben etc. setzen, und zwar anwendungsweit gleich.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Swing Komponenten nicht sichtbar nach Start AWT, Swing, JavaFX & SWT 12
H Fehler: Zum Ausführen dieser Anwendung benötigte JavaFX-Runtime-Komponenten fehlen AWT, Swing, JavaFX & SWT 44
H Swing , GridLayout, Größenbestimmung der Komponenten im Layout AWT, Swing, JavaFX & SWT 8
BabySuna Swing Komponenten auslagern auf separate Datei AWT, Swing, JavaFX & SWT 8
B Mit ContentPane werden Komponenten angezeigt, mit SplitPane, JPanel nicht? AWT, Swing, JavaFX & SWT 6
P AWT Einzelne Komponenten zur Laufzeit austauschen? AWT, Swing, JavaFX & SWT 3
D [Swing] Anordnung von Komponenten mit GridLayout Manager AWT, Swing, JavaFX & SWT 13
L Komponenten eines Panels werden erst nach Klick darauf angezeigt AWT, Swing, JavaFX & SWT 13
E Komponenten von JScrollPane werden nicht richtig ermittelt AWT, Swing, JavaFX & SWT 2
F Gebundene Eigenschaften bei Komponenten mit NetBeans verarbeiten AWT, Swing, JavaFX & SWT 3
H LayoutManager Probleme mit Positionierung/Abständen der Komponenten AWT, Swing, JavaFX & SWT 14
dereki2000 Swing JFrame nah hinzufügen von Komponenten akualisieren. AWT, Swing, JavaFX & SWT 2
L Swing Komponenten erst nach Resize sichtbar AWT, Swing, JavaFX & SWT 2
S Swing Panel übernimmt komponenten von anderem AWT, Swing, JavaFX & SWT 7
T Reihenfolge der Komponenten im einem JFrame AWT, Swing, JavaFX & SWT 8
P Gleichmäßige Anodnung von Komponenten im migLayout AWT, Swing, JavaFX & SWT 2
DaCrazyJavaExpert Swing Komponenten genauer anordnen. AWT, Swing, JavaFX & SWT 13
DaCrazyJavaExpert Swing Komponenten in GridBagLayout werden Falsch angeordnet AWT, Swing, JavaFX & SWT 1
P Größe und Ausrichtung von Komponenten festlegen AWT, Swing, JavaFX & SWT 13
MaxG. Swing Swing Komponenten zur Laufzeit hinzufügen AWT, Swing, JavaFX & SWT 2
D Swing Komponenten Anordnung eines Panels in Verbindung eines weiteren Panels AWT, Swing, JavaFX & SWT 9
N Swing Wie Programm strukturieren? (Dynamisch Komponenten hinzufügen) AWT, Swing, JavaFX & SWT 1
Neumi5694 LookAndFeel Look & Feel nicht angezeigter Komponenten ändern AWT, Swing, JavaFX & SWT 6
D JavaFX GUI Komponenten werden langsam bei größerer Datenmenge AWT, Swing, JavaFX & SWT 6
R Komponenten von JPanel bleiben unsichtbar AWT, Swing, JavaFX & SWT 2
D JavaFX Welche Komponenten vermisst ihr? Welche wären essenziell notwendig? AWT, Swing, JavaFX & SWT 8
M Datei mit Komponenten einbinden AWT, Swing, JavaFX & SWT 7
T SWT Externer zugrif auf SWT Komponenten AWT, Swing, JavaFX & SWT 3
Shams Probleme bei dem Hinzufügen von Komponenten zu einem JFrame AWT, Swing, JavaFX & SWT 3
J MouseOver bei Komponenten AWT, Swing, JavaFX & SWT 9
S Größe der Komponenten, beim ändern der größe des Frames, mit ändern! AWT, Swing, JavaFX & SWT 2
D LayoutManager GUI skalieren und deren Komponenten mit Grid(Bag)Layout-Manager. AWT, Swing, JavaFX & SWT 5
G Komponenten vergrößern sich nicht trotz Layoutmanager AWT, Swing, JavaFX & SWT 24
M JavaFX Scenebuilder eigene Komponenten AWT, Swing, JavaFX & SWT 8
A Swing per JComboBox gewünschtes Attribut auswählen und Komponenten passen sich an AWT, Swing, JavaFX & SWT 7
A JavaFX Eigene Komponenten im Scene Builder AWT, Swing, JavaFX & SWT 0
Q Swing Fenster updaten - Hinzugefügte Komponenten darstellen AWT, Swing, JavaFX & SWT 3
S BoxLayout: Anordnung der Komponenten links statt zentriert AWT, Swing, JavaFX & SWT 0
Bartertown JTable - Verschiedene Komponenten in einer Spalte unterbringen AWT, Swing, JavaFX & SWT 3
U Frame zeigt keine Komponenten AWT, Swing, JavaFX & SWT 7
G Applet Applet Komponenten flackern AWT, Swing, JavaFX & SWT 10
K LayoutManager Probleme mit 2 Komponenten AWT, Swing, JavaFX & SWT 9
M Komponenten übereinander AWT, Swing, JavaFX & SWT 7
R Komponenten werden erst nach maximierung des Frames sichtbar (Linux) AWT, Swing, JavaFX & SWT 5
H Swing Getter für GUI-Komponenten AWT, Swing, JavaFX & SWT 3
B Komponenten in Fenster verdrängen sich untereinander AWT, Swing, JavaFX & SWT 6
N Komponenten übereinander AWT, Swing, JavaFX & SWT 3
S Anordnung von GUI-Komponenten mit LayouManger (Problem beim anzeigen von JTextField) AWT, Swing, JavaFX & SWT 5
M Swing Komponenten enablen? AWT, Swing, JavaFX & SWT 4
X Java Komponenten jeder Zeit hinzufügen können AWT, Swing, JavaFX & SWT 3
S View-Komponenten im Controller bekannt machen AWT, Swing, JavaFX & SWT 7
D Grafische Komponenten komplett neu aufbauen (Neukonstruktion) AWT, Swing, JavaFX & SWT 5
A AWT Komponenten in JavaFX einbetten AWT, Swing, JavaFX & SWT 9
M Swing Komponenten erscheinen beim darüberfahren? AWT, Swing, JavaFX & SWT 7
H Komponenten unmittelbar nach dem Ausführen teilweise unsichtbar AWT, Swing, JavaFX & SWT 3
K GUI in Komponenten aufteilen (MVC) AWT, Swing, JavaFX & SWT 2
W Funktionen, sowie aufruf einiger Komponenten AWT, Swing, JavaFX & SWT 4
J Alle Komponenten eines JFrames durchlaufen AWT, Swing, JavaFX & SWT 2
R Swing Komponenten bleiben bei Animation unsichtbar AWT, Swing, JavaFX & SWT 7
T Unter JPanel liegende Komponenten "totschalten" AWT, Swing, JavaFX & SWT 5
morphesus Swing Komponenten werden nicht angezeigt AWT, Swing, JavaFX & SWT 8
C Swing Reihenfolge der Initialisierung von Komponenten AWT, Swing, JavaFX & SWT 6
Asamandra LayoutManager GridBagLayout - Komponenten (mit fill?) vergrößern aber Proportionen dabei erhalten? AWT, Swing, JavaFX & SWT 3
B Swing Komponenten auf JApplet setSize AWT, Swing, JavaFX & SWT 7
B Swing Komponenten auf JApplet setSize AWT, Swing, JavaFX & SWT 2
W Bildgröße automatisch an Komponenten anpassen AWT, Swing, JavaFX & SWT 3
TheWhiteShadow Swing Komponenten organisieren AWT, Swing, JavaFX & SWT 9
S Überlappung zweier Komponenten AWT, Swing, JavaFX & SWT 12
Z größe der komponenten bestimmen AWT, Swing, JavaFX & SWT 16
C GUI-Komponenten skalieren AWT, Swing, JavaFX & SWT 10
M Seltsames Problem mit Resize eines Fensters und seiner Komponenten AWT, Swing, JavaFX & SWT 2
D Swing Komponenten verstecken AWT, Swing, JavaFX & SWT 4
X Swing Resizing der Komponenten innheralb eines Panels AWT, Swing, JavaFX & SWT 2
T Swing Font für alle Komponenten ändern AWT, Swing, JavaFX & SWT 2
S Problem mit Swing Komponenten AWT, Swing, JavaFX & SWT 11
A Swing Alle Komponenten auf JFrame ermitteln AWT, Swing, JavaFX & SWT 4
E LookAndFeel Eigene Komponenten mit Synth L&F stylen AWT, Swing, JavaFX & SWT 2
S Swing Frame und Klasse extends JPanel - Komponenten zur Laufzeit austauschen AWT, Swing, JavaFX & SWT 18
S JButton und textfield.setText - Komponenten über-/verdecken sich AWT, Swing, JavaFX & SWT 15
M Komponenten übereinander prüfen AWT, Swing, JavaFX & SWT 3
W LayoutManager GridBag richtig nutzen - Komponenten richtig anordnen und automatisch vergrößern AWT, Swing, JavaFX & SWT 5
M Komponenten in anderer Reihenfolge anzeigen AWT, Swing, JavaFX & SWT 4
G swing Komponenten verrutschen ständig... AWT, Swing, JavaFX & SWT 6
D Mit GridBayLayout Komponenten anordnen AWT, Swing, JavaFX & SWT 6
N Window transparent, Komponenten nicht transparent AWT, Swing, JavaFX & SWT 11
R Farbänderung von Komponenten wird nicht wirksam AWT, Swing, JavaFX & SWT 7
P Swing Hierachie oder Reihenfolge von Komponenten AWT, Swing, JavaFX & SWT 5
T Sich überlappende Komponenten AWT, Swing, JavaFX & SWT 2
D Swing Probleme beim Anzeigen der einzelnen Komponenten AWT, Swing, JavaFX & SWT 16
R Swing Komponenten klein angezeigt AWT, Swing, JavaFX & SWT 10
D Swing Swing Komponenten verschieben AWT, Swing, JavaFX & SWT 7
B Komponenten nach Skalierung nicht mehr ansprechbar AWT, Swing, JavaFX & SWT 9
Kr0e AWT Komponenten in JPanel AWT, Swing, JavaFX & SWT 6
JuliaOne Komponenten innerhalb eine JScrollpane werden auch ausserhalb davon gezeichnet! AWT, Swing, JavaFX & SWT 7
xehpuk Swing Komponenten werden durch setFont() winzig AWT, Swing, JavaFX & SWT 3
O Größe von Komponenten im JFrame manuell verändern AWT, Swing, JavaFX & SWT 2
M Swing Komponenten mit fester Größe an Fensterrand(JFrame) AWT, Swing, JavaFX & SWT 2
A Komponenten zur Laufzeit entfernen AWT, Swing, JavaFX & SWT 3
Weiti Swing Animationen - Drehung aller Komponenten auf Knopfdruck AWT, Swing, JavaFX & SWT 12
P LayoutManager Komponenten einfügen (FlowLayout, BoxLayout) AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben