Swing JColorChooser Font ändern

Shadowqueen105

Neues Mitglied
Hallo liebe Community,

ich bin neu hier und möchte nach erfolgloser Onlinerecherche nun euch um Rat fragen. Mein Problem ist, dass ich gerne einen Standard-JColorChooser verwenden möchte, allerdings den Font meines restlichen Programms und eben auch des JColorChoosers anpassen möchte.

Leider habe ich es bisher nur geschafft, den Font des Vorschaufensters zu verändern. Die Überschriften der Farbauswahl-Tabs, die Überschrift des Vorschaufensters, die Button-Beschriftungen, die Titelzeile "Change Font Color" und die Farbsammlung mit Überschrift "Aktuell:" konnte ich allerdings noch nicht beeinflussen. ;(

Anbei findet ihr ein Minimalbeispiel zur Veranschaulichung. Irgendwie habe ich das Gefühl, ich bin noch gar nicht zu der Ebene der Komponenten, welche ich anpassen möchte, runtergedrungen...

Habt ihr eine Idee, wie ich die Fonts abändern kann??? Über Hilfe würde ich mich sehr freuen!

Viele Grüße
Shadowqueen105

Java:
//-------Die Hauptklasse---------
package helloworld;

public class HelloWorld {

	public static void main(String[] args) {
		ColoredFrame f = new ColoredFrame();
		f.setSize(300, 200);
		f.setVisible(true);
	}

}

//-------Die eigentliche Problemklasse---------
package helloworld;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.colorchooser.AbstractColorChooserPanel;

public class ColoredFrame extends JFrame implements ActionListener{
	
	private static final long serialVersionUID = 1L;
	private JColorChooser myChooser = new JColorChooser();
	private JLabel hi;
	private JButton bColor;
	
	public ColoredFrame() {
		super();
		init();
	}
	
	private void init() {
		this.setLayout(new BorderLayout());
		this.getContentPane().setBackground(Color.white);
		this.setFont(new Font("Arial", Font.PLAIN, 28));
		
		hi = new JLabel("HelloWorld!");
		hi.setPreferredSize(new Dimension(200,50));
		hi.setFont(new Font("Arial", Font.PLAIN, 28));
		this.add(hi, BorderLayout.NORTH);
		
		bColor = new JButton("Change Color");
		bColor.setPreferredSize(new Dimension(100,30));
		bColor.addActionListener(this);
		bColor.setActionCommand("colorChooser");
		bColor.setFont(new Font("Arial", Font.PLAIN, 28));
		this.add(bColor, BorderLayout.SOUTH);
	}

	@Override
	public void actionPerformed(ActionEvent arg0) {
		if (arg0.getActionCommand().equals("colorChooser")) {
			
			JDialog dCC = JColorChooser.createDialog(
			          this, "Change Font Color", true, myChooser, new ActionListener() {
			        	  public void actionPerformed(ActionEvent e) {
			        		  Color newColor = myChooser.getColor();
			        		  hi.setForeground(newColor);
			        		  bColor.setForeground(newColor);
			        	  }
			          }, null);
			//try to set font of the whole JDialog --> doesn't work
			dCC.setFont(new Font("Arial", Font.PLAIN, 28));
			
			//this works
			myChooser.getPreviewPanel().setFont(new Font("Arial", Font.PLAIN, 28));
			
			for (AbstractColorChooserPanel p: myChooser.getChooserPanels()) { 
				/*try to set font of the each AbstractColorChooserPanel
				 * --> doesn't work*/
				p.setFont(new Font("Arial", Font.PLAIN, 28));
				/*try to set font of the each component on each AbstractColorChooserPanel
				 * --> doesn't work*/
				for (Component c: p.getComponents()) {
					c.setFont(new Font("Arial", Font.PLAIN, 28));
				}
			}
			dCC.setVisible(true);
		}
		
	}
}
 
Hallo Shadowqueen105,

falls der Font in der ganzen Applikation gleich sein soll, kannst du anstatt den Font für jeden Component einzeln zu setzen, einen UIManager verwenden.

Das ganze schaut dann so aus:

Java:
public class HelloWorld {
 
    private static void setUIFont(FontUIResource f) 
    {
        Enumeration<Object> keys = UIManager.getDefaults().keys();
        
        while (keys.hasMoreElements()) 
        {
            Object key = keys.nextElement();
            Object value = UIManager.get(key);
            if (value instanceof FontUIResource) {
                FontUIResource orig = (FontUIResource) value;
                Font font = new Font(f.getFontName(), orig.getStyle(), f.getSize());
                UIManager.put(key, new FontUIResource(font));
            }
        }
    }
   
    public static void main(String[] args) {
	    setUIFont(new FontUIResource(new Font("Arial", Font.PLAIN, 28)));
		
        ColoredFrame f = new ColoredFrame();
        f.setSize(300, 200);
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

Das hat den positiven Nebeneffekt, dass du den Font zentral verwalten kannst. Sprich änderst du ihn hier, ändert er sich überall. Falls du für bestimme Elemente eine Ausnahme brauchst, wird ein direktes Setzen an der Komponente den UIManager overrulen. Damit das funktioniert, musst du die ganzen setFont-Aufrufe in ColoredFrame entfernen.

Beispiel:

UIManager: Arial, 10pt
JButton: Courier, 30pt

siehe Anhang
 

Anhänge

  • uimanager.png
    uimanager.png
    56,8 KB · Aufrufe: 38
Hallo lordofdonuts,

vielen, vielen Dank für die ausführliche Antwort! Den Font über den UIManager allgemein gültig zu setzen ist natürlich viel eleganter und sinnvoller als jede Komponente einzeln anzupassen - zumindest wenn man den Font von allen Komponenten ändern möchte. Aber genau das war mein Anliegen.

Mein eigentlicher Anwendungsfall war zwar etwas komplexer als das Minimalbeispiel, da ich den Font zur Laufzeit dynamisch anpassen möchte und man den JColorChooser etwas dazu überreden muss. Aber einmal auf die richtige Fährte mit dem UIManager gesetzt, war das auch kein Problem mehr. Nun kann ich fröhlich weiter implementieren! Danke! :toll:

Shadowqueen105
 

Zurück
Oben