# Schriftarten global ändern



## Gast (29. Jul 2008)

Hi Leute.

Ich such gerade ne Möglichkeit, wie ich die Schriftarten aller swing komponenten global vergrössern kann. Das müsste ja eigentlich über das Look and Feel gehen, aber ich find da leider nicht die Stelle, wo ich die Schriftart anpassen kann.

Kann mir da einer nen Tipp oder was code geben?  Danke!


----------



## SlaterB (29. Jul 2008)

http://www.java-forum.org/de/viewtopic.php?t=72181


----------



## Gast (29. Jul 2008)

ah cool danke, das hab ich mit der suche nicht gefunden.

Funktioniert auch, allerdings hab ich 2 Probleme, weshalb ich die mthode mit dem look and feel benötige. Sonst haben ja neue komponenten noch die standard schrift.



> String name = "Lucida Sans Typewriter";
> int size = 14;
> //PLAIN=1, BOLD=1, ITALIC=2
> Font[] fonts = {new Font(name, 0, size), new Font(name, 1, size),
> ...



Dachte, dass kann ich benutzen, aber der schmiert mit bei "      Object key = i.next();" immer mit ner concurrentModificationException ab


----------



## SlaterB (29. Jul 2008)

vielleicht wird bei UIManager.put() die gleiche Liste, bzw dieses Set der Map (?) bearbeitet,

kannst dir ja vorher eine Kopie anlegen, dann kann es einen derartigen Fehler nicht geben,
aber dann ist es fraglich, ob du mit dem nicht mehr ganz so aktuellen Set überhaupt noch weiterarbeiten solltest


----------



## Gast (29. Jul 2008)

naja daran hab ich auch schon gedacht. aber die exception tritt ja schon bei i.next() auf. Das ist ja das komisch...
Wenn ich mir in der schleife einfach nur i.next() ausgeben lasse, dann kommt all das hier


> TabbedPane.textIconGap
> RootPane.questionDialogBorder
> RootPane.colorChooserDialogBorder
> CheckBoxMenuItem.border
> ...


und dann fliegt die exception...

sehr komisch...


----------



## Marco13 (29. Jul 2008)

Brutal:
 for(Iterator i = defs.keySet().iterator(); i.hasNext(); ) { 
ersetzen durch
 for(Iterator i = new HashSet(defs.keySet()).iterator(); i.hasNext(); ) {


----------



## Guest (29. Jul 2008)

Marco13 hat gesagt.:
			
		

> Brutal:
> for(Iterator i = defs.keySet().iterator(); i.hasNext(); ) {
> ersetzen durch
> for(Iterator i = new HashSet(defs.keySet()).iterator(); i.hasNext(); ) {



Vielen Dank! Jetzt funktionierts!


----------



## Gast (30. Jul 2008)

Also so ganz genau wie ich das haben will läuft das leider noch nicht.

Das Problem ist glaube ich, dass ich immer die defaultwerte des look and feel lade. Kann man nicht die aktuellen werte laden und dann mit denen arbeiten?

Hier mal mein code

```
public class FontScalePanel extends JPanel {

	
	
	JButton incrementSize;
	JButton decrementSize;
	public FontScalePanel(){
		super();
		setLayout(new BoxLayout(this,BoxLayout.Y_AXIS));
		
		
		incrementSize = new JButton("vergroessern");
		decrementSize = new JButton("verkleinern");
		
		
		add(decrementSize);
		add(incrementSize);
		
		incrementSize.addActionListener(new ActionListener(){

			public void actionPerformed(ActionEvent arg0) {
				incrementFontSize();
				
			}
			
		});
		
		
	}
	
	private void incrementFontSize(){
		// TODO: hier nicht immer die default werte laden!!!
		 UIDefaults defs = (UIDefaults) UIManager.getLookAndFeelDefaults().clone();
		 
       
	        for(Iterator i = new HashSet(defs.keySet()).iterator(); i.hasNext(); ) {	System.out.println(i.next());
	            Object key = i.next();
		        Font font = defs.getFont(key);
	            if (font != null){
	            	int size = font.getSize()+1;
	    	        //PLAIN=1, BOLD=1, ITALIC=2
	    	        Font[] fonts = {new Font(font.getName(), 0, size), new Font(font.getName(), 1, size),
	    	        new Font(font.getName(), 2, size), new Font(font.getName(), 3, size)};
	            	
	                UIManager.put(key, fonts[font.getStyle()]);
	            }
     	}
	        
	        SwingUtilities.updateComponentTreeUI(this);
		
	}
	
	
	public static void main (String [] args){
		JFrame f = new JFrame();
		
		f.add(new FontScalePanel());
		f.pack();
		f.setVisible(true);
		
	}
}
```

Das sollte quasi so sein, dass sich die schrift immer vergrössert wenn man auf increment klickt.


----------



## Gast (30. Jul 2008)

Hab jetzt noch n bisschen was geändert, so dass es eigentlich funktionieren müsste
[¢ode]
public class FontScalePanel extends JPanel {

	static JFrame f = new JFrame();
	JButton incrementSize;
	JButton decrementSize;
	 UIDefaults defs = (UIDefaults) UIManager.getLookAndFeelDefaults().clone();	

	public FontScalePanel(){
		super();
		setLayout(new BoxLayout(this,BoxLayout.Y_AXIS));


		incrementSize = new JButton("vergroessern");
		decrementSize = new JButton("verkleinern");


		add(decrementSize);
		add(incrementSize);

		incrementSize.addActionListener(new ActionListener(){

			public void actionPerformed(ActionEvent arg0) {
				incrementFontSize();

			}

		});


	}

	private void incrementFontSize(){
		// TODO: hier nicht immer die default werte laden!!!

		 System.out.println("FontScalePanel.incrementFontSize()");





	        for(Iterator i = new HashSet(defs.keySet()).iterator(); i.hasNext(); ) {
	            Object key = i.next();
	            Font font = defs.getFont(key);

	            if (font != null){
	            	int size = font.getSize()+1;
	    	        //PLAIN=1, BOLD=1, ITALIC=2
	    	        Font[] fonts = {new Font(font.getName(), 0, size), new Font(font.getName(), 1, size),
	    	        new Font(font.getName(), 2, size), new Font(font.getName(), 3, size)};
	                UIManager.put(key, fonts[font.getStyle()]);
	                defs.put(key, fonts[font.getStyle()]);
	                //System.out.println(font);
	                System.out.println(UIManager.get(key));
	            }
     	}

	        SwingUtilities.updateComponentTreeUI(f);

	}


	public static void main (String [] args){


		f.add(new FontScalePanel());
		f.pack();
		f.setVisible(true);

	}
}[/code]

Die Schriftart wird nun immer vergrössert, allerdings "sieht" man das nur nach dem ersten mal, danach wird nichts grösser. Warum ist das so?


----------

