# Schriftgrößen aller Objekte ändern



## double_pi (26. Sep 2007)

Hallo,

bin noch frisch in der java-welt und brauche etwas hilfe...

ich möchte in meinem Beispiel die Schriftgröße aller Objekte ändern, allerdings bekomme ich das bisher nur für mein textfeld hin:



```
public void widgetSelected(SelectionEvent e) {		        
		        text.setFont(new Font(null, "Tahoma", 10, SWT.NORMAL));
		        text.setForeground(display.getSystemColor(SWT.COLOR_RED));
		        text.setText("Ich bin ein Testtext!\n");
		        GridData gd = new GridData(GridData.FILL_BOTH);
		        gd.horizontalSpan = 2;
		        text.setLayoutData(gd);
			}
```


weiß jmd wie man die schriftgröße zentral ändert, so dass nicht nur das textfeld beeinflußt wird, sondern auch alle dargestellten buttons und die fensterüberschrift?

für hilfe bin ich sehr dankbar...

lg pp


----------



## *Hendrik (26. Sep 2007)

www.tutego.com/blog/javainsel/2005/12/adjust-font-size-in-swing-applications.html


----------



## double_pi (27. Sep 2007)

hallo Hendrik,

erstmal danke für den link. damit konnte ich nun also ein bisl rumprobieren, aber ich bin leider nicht entscheidend vorangekommen. ich habe das problem, dass er *Enumeration, UIManager, Font *und *FontUIResource *nicht erkennt und ich keine ahnung habe, wie ich diese objekte oder variablen anlegen soll.

kann mir da nochmal jmd helfen?


----------



## *Hendrik (27. Sep 2007)

```
import java.awt.Font;
import java.util.Enumeration;
import javax.swing.UIManager;
import javax.swing.plaf.FontUIResource;
```


----------



## double_pi (27. Sep 2007)

hallo nochmal,
danke für den tipp, da haben tatsächlich noch bibliotheken gefehlt. ich hab aber leider vergessen zu schreiben, dass ich bereits folgende bibliothek importiert habe und auch bereits verwende:


```
import org.eclipse.swt.graphics.Font;
```


somit gibts probleme mit der folgenden bibliothek:



			
				*Hendrik hat gesagt.:
			
		

> ```
> import java.awt.Font;
> ```




ich hab meinen code mit deinen hinweise verändert und hoffe, dass es nun prinzipiell richtig ist. ich weiß jetzt nicht, ob das so alles so sinn macht, aber ich poste hier mal den inhalt meines auslösenden objekts. ecplipse findet keine fehler mehr. aber das ergebnis ist auch nicht das gewünschte. ich bekomme lediglich den inhalt eines textfeldes geändert, ich will aber alle auftretenden schriften zentral bearbeiten:



```
// erstellt den Plus-Knopf
        Button PlusButton = new Button(shell, SWT.PUSH);
        PlusButton.setText("  +  ");
        PlusButton.setFont(fontRegistry.get("button-text"));
        
        PlusButton.addSelectionListener(new SelectionListener() {
			public void widgetDefaultSelected(SelectionEvent e) {
			
			}
			
			// wird durchlaufen wenn der Plus-Knopf ausgelöst wird
			public void widgetSelected(SelectionEvent e) {		        
				// auslesen der Schriftgröße
				aktSchriftgrad = text.getFont().getFontData()[0].getHeight();
				aktSchriftart = text.getFont().getFontData()[0].getName();
				
				// erhöhen der Schriftgröße um 1
				text.setFont(new Font(display, aktSchriftart,aktSchriftgrad + 1,SWT.NORMAL));
				
				GridData gd = new GridData(GridData.FILL_BOTH);
		        gd.horizontalSpan = 2;
		        text.setLayoutData(gd);
		        
		        Enumeration g = UIManager.getDefaults().keys(); g.hasMoreElements();
		    	Object key = g.nextElement();
		    	Object value = UIManager.get( key );
		    	
		    	if ( value instanceof Font )
		    	{
		    		Font f = (Font) value;
		    		
		    		UIManager.put( key, new FontUIResource( f.getFontData()[0].getName(), f.getFontData()[0].getStyle(), aktSchriftgrad ));
		    		}
				}
	        });
```


sorry, aber ich glaube anders geht es nicht mehr! i really tried! :bahnhof:


----------



## Marco13 (27. Sep 2007)

Bei solchen Konflikten wie
org.eclipse.swt.graphics.Font;
und
import java.awt.Font;
kann man "voll qualifizierte" Klassennamen verwenden. 

In diesem Fall aäre das dann sowas wie

```
if ( value instanceof java.awt.Font ) // Genau sagen, um welche Font-Klasse es geht
             {
                java.awt.Font f = (java.awt.Font) value;
                
                UIManager.put( key, new FontUIResource( f.getFontData()[0].getName(), f.getFontData()[0].getStyle(), aktSchriftgrad ));
                }
            }
```


----------



## double_pi (27. Sep 2007)

Marco13 hat gesagt.:
			
		

> Bei solchen Konflikten wie
> org.eclipse.swt.graphics.Font;
> und
> import java.awt.Font;
> ...




danke gut zu wissen,
aber diese anweisung macht bei mir irgendwie garnix! alle buttons und labels bleiben unverändert! lediglich mein textfeld ändert sich so wie ich es mir wünsche, aber das hab ich ja unabhängig von der letzten änderung hinbekommen.

zu den konkreten änderungen...
ich hab folgenden code aus den objektbezogenen methoden rausgenommen und in die klassendeklaration (public class MessagePopupAction) gesteckt: 


```
Enumeration g = UIManager.getDefaults().keys();
	Object key = g.nextElement();
	Object value = UIManager.get( key );
```


und mein selectionlistener sieht jetzt so aus:


```
MinusButton.addSelectionListener(new SelectionListener(){
			public void widgetDefaultSelected(SelectionEvent e) {
				
			}
			
			// wird durchlaufen wenn der Minus-Knopf ausgelöst wird
			public void widgetSelected(SelectionEvent e) {
		        // auslesen der Schriftgröße
				aktSchriftgrad = text.getFont().getFontData()[0].getHeight();
				aktSchriftart = text.getFont().getFontData()[0].getName();
				
				// reduzieren der Schriftgröße um 1, wenn Schriftgröße größer als 8  
				if ((aktSchriftgrad > 8))
					text.setFont(new Font(display, aktSchriftart,aktSchriftgrad - 1,SWT.NORMAL));
					
					GridData gd = new GridData(GridData.FILL_BOTH);
			        gd.horizontalSpan = 2;
			        text.setLayoutData(gd);
			        
			        g.hasMoreElements();
			        
			        if ( value instanceof java.awt.Font ) // Genau sagen, um welche Font-Klasse es geht 
			        { 
			           java.awt.Font f = (java.awt.Font) value; 
			           
			           UIManager.put( key, new FontUIResource( f.getFontName(), f.getStyle(), aktSchriftgrad )); 
			           }
			    	}
			    }
			);
```


was mache ich falsch?


----------



## *Hendrik (27. Sep 2007)

Rufe am Ende Deiner Methode
	
	
	
	





```
SwingUtilities.updateComponentTreeUI(this);  //this = Dein Fenster
```
auf


----------



## Guest (28. Sep 2007)

*Hendrik hat gesagt.:
			
		

> Rufe am Ende Deiner Methode
> 
> 
> 
> ...



geht nicht! Eclipse liefert folgenden Fehler:


```
Syntaxfehler bei Token "this". Token muss gelöscht werden.
```


in der Hilfe ist die Componente so beschrieben: 


```
updateComponentTreeUI
public static void updateComponentTreeUI(Component c)
```

die Bibliothek javax.swing.SwingUtilities ist auch eingebunden.

ist das so wirklich richtig?


----------



## *Hendrik (28. Sep 2007)

this wird bei Dir nicht funktionieren, wenn Du z.B. die Funktion in einer separaten Klasse aufrufst - wie z.B. einem ActionListener. Dann müsstest Du eine Referenz auf Dein Fenster übergeben. Mit der Methode updateComponentTreeUI() sollen alle dem Component untergeordneten Elemente aktualisiert werden - in Deinem Fall die neue Schriftgröße anzeigen. Aus diesem Grund solltest Du der Methode eine Referenz auf Dein Fenster übergeben. Bisher funktioniert Dein Code nicht, weil Du Deinen Componenten zwar eine neue Schriftgröße zuweist, aber die Anzeige nicht aktualisierst.
Verwendest Du eigentlich Swing oder SWT?


----------



## Guest (28. Sep 2007)

*Hendrik hat gesagt.:
			
		

> this wird bei Dir nicht funktionieren, wenn Du z.B. die Funktion in einer separaten Klasse aufrufst - wie z.B. einem ActionListener. Dann müsstest Du eine Referenz auf Dein Fenster übergeben. Mit der Methode updateComponentTreeUI() sollen alle dem Component untergeordneten Elemente aktualisiert werden - in Deinem Fall die neue Schriftgröße anzeigen. Aus diesem Grund solltest Du der Methode eine Referenz auf Dein Fenster übergeben. Bisher funktioniert Dein Code nicht, weil Du Deinen Componenten zwar eine neue Schriftgröße zuweist, aber die Anzeige nicht aktualisierst.
> Verwendest Du eigentlich Swing oder SWT?




also vielen dank nochmal für eure mühen, 
ich führe den code in der Klasse MessagePopupAction aus und verwende eigentlich SWT, aber ich hab jetzt auch schon diese bibliotheken importiert:


```
import javax.swing.UIManager; 
import javax.swing.plaf.FontUIResource;
import javax.swing.SwingUtilities;
```

lieber wärs mir aber soviele bibliotheken wie möglich einzusparen - also das ganze in SWT.


die anweisung _SwingUtilities.updateComponentTreeUI(this);_ habe ich bereits an mehreren stellen innerhalb meiner MessagePopupAction reinkopiert und auf die reaktion von eclipse geachtet - hier ein überblick der ergebnisse:

in Methode _public void run() _liefert die anweisung folgenden fehler - "Die Methode updateComponentTreeUI(Component) im Typ SwingUtilities ist für die Argumente nicht  anwendbar (MessagePopupAction)"

in methode _public void widgetSelected(SelectionEvent e)_ zum objekt MinusButton.addSelectionListener liefert die anweisung folgendes - "Syntaxfehler bei Token "this". Token muss gelöscht werden."

in methode _public static void main(String[] args)_ liefert die anweisung diesen fehler - "Verwendung von this in einem statischen (static) Kontext nicht möglich"


und mehr prinzipiell unterschiedliche möglichkeiten gibt es ja auch nicht.


----------



## *Hendrik (28. Sep 2007)

Mein Link war ein Swing Beispiel, deswegen funktioniert es offensichtlich nicht so wie gewünscht.

Schau Dir mal den Absatz "Synchronizing with System Settings"  von Link an.

Gibt auch ein Beispiel dazu.


----------



## Guest (28. Sep 2007)

ok, ich hab das jetzt soweit eingebunden bekommen und auch die fehlenden bibliotheken nachgetragen. allerdings sind in dem code einige dinge mit "..." dargestellt, die ich auch mit der hilfe nicht hinbekomme:


```
...
            org.eclipse.swt.graphics.Font currentSystemFont = ...;
            FontData fontData = currentSystemFont.getFontData()[0];
```


```
UIManager.put("Button.font", fontResource); 
            UIManager.put("CheckBox.font", fontResource); 
            UIManager.put("ComboBox.font", fontResource); 
            ...    // many more similar calls
```


```
Container contentPane = ... // content pane from the root pane
```


ich weiß weder was da hin soll noch wie die systax dafür ist. kann mir da nochmal jmd helfen?


----------



## double_pi (28. Sep 2007)

Gast bin übrigens ich!


----------



## *Hendrik (28. Sep 2007)

Also mit SWT kenne ich mich leider nicht aus. Hier steht z.B. das es nicht geht. Aber Du kannst ja noch ein wenig rumbasteln.

Auf der Seite war doch auch ein Link, wo man sich den Example-Code herunterladen kann. Vielleicht hilft Dir das weiter, die Lücken zu füllen.

Wenn Du die Schriftgröße statisch verändern willst: Link  - wie gesagt, ich habe aber keine Ahnung davon.


----------



## double_pi (18. Dez 2007)

hallo, ich hab jetzt eine für mich annehmbare lösung gefunden. entspricht zwar nicht dem betreff, weil nicht alle objekte angesprochen werden, sondern nur vordefinierte, aber es ist eine lösung! wens interessiert...



```
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
//import org.eclipse.swt.widgets.Widget;
import org.eclipse.ui.part.ViewPart;

public class ViewPart1 extends ViewPart {
	
	int aktSchriftgrad;
	Font Schriftdaten;
	String aktSchriftart;
//	Control Fenster;
	
	public static final String ID = "test";
	static Font StdSchriftart = new Font(null, new FontData("Arial", 10, SWT.BOLD));
	
	
	public void createPartControl(final Composite parent) {
		
		parent.setLayout(new GridLayout(2, false));
		parent.setFont(StdSchriftart);
		
		aktSchriftgrad = parent.getFont().getFontData()[0].getHeight();
		
		
		// reservieren des ersten Auswahl-Knopf
	    Button Auswahl1Button = new Button(parent, SWT.RADIO);
	    // reservieren des zweiten Auswahl-Knopf
	    Button Auswahl2Button = new Button(parent, SWT.RADIO);
	    // reservieren des dritten Auswahl-Knopf
	    Button Auswahl3Button = new Button(parent, SWT.RADIO);
	    // reservieren des vierten Auswahl-Knopf
	    Button Auswahl4Button = new Button(parent, SWT.RADIO);
	    
	    
        // legt alle vier Radiobuttons an und bestimmt deren Beschriftung      
        Auswahl1Button.setText("Serif/variabel:");
        Auswahl2Button.setText("Serif/fest:");
        Auswahl3Button.setText("Sans-Serif/variabel:");
        Auswahl4Button.setText("Sans-Serif/fest:");
        
        
        // erstellt den Minus-Knopf
        Button MinusButton = new Button(parent, SWT.PUSH);
        // erstellt den Plus-Knopf
        Button PlusButton = new Button(parent, SWT.PUSH);
        // erstellt den Default-Knopf
        Button DefaultButton = new Button(parent, SWT.PUSH);
        
	    // übergibt die Unterobjekte der Ansicht der Konstante con
	    final Control[] con = parent.getChildren();
	    
	    
        Auswahl1Button.addSelectionListener(new SelectionListener(){
			public void widgetDefaultSelected(SelectionEvent e) {
				
			}
			
			// wird durchlaufen wenn der erste Auswahlknopf ausgelöst wird
			public void widgetSelected(SelectionEvent e) {
    			
				for(int i = 0; i < con.length; i++) {
					// ändert die Schriftart auf Serif/variabel
					
	    			aktSchriftgrad = con[i].getFont().getFontData()[0].getHeight();
	    			con[i].setFont(new Font(null, "Bookman Old Style", aktSchriftgrad, SWT.BOLD));
	    			
//	    			Fenster.setFont(new Font(null, aktSchriftart, aktSchriftgrad, SWT.BOLD));
//					Fenster.update();
				}
			}
        });
        
        Auswahl2Button.addSelectionListener(new SelectionListener(){
			public void widgetDefaultSelected(SelectionEvent e) {
				
			}
			
			// wird durchlaufen wenn der zweite Auswahlknopf ausgelöst wird
			public void widgetSelected(SelectionEvent e) {
    			
				for(int i = 0; i < con.length; i++) {
	    			// ändert die Schriftart auf Serif/fest
	    			aktSchriftgrad = con[i].getFont().getFontData()[0].getHeight();
	    			con[i].setFont(new Font(null, "Courier New", aktSchriftgrad, SWT.BOLD));
				}
			}
        });
        
        Auswahl3Button.addSelectionListener(new SelectionListener(){
			public void widgetDefaultSelected(SelectionEvent e) {
				
			}
			
			// wird durchlaufen wenn der dritte Auswahlknopf ausgelöst wird
			public void widgetSelected(SelectionEvent e) {
    			
				for(int i = 0; i < con.length; i++) {
					// ändert die Schriftart auf Sans-Serif/variabel
	    			aktSchriftgrad = con[i].getFont().getFontData()[0].getHeight();
	    			con[i].setFont(new Font(null, "Arial", aktSchriftgrad, SWT.BOLD));
				}
			}
        });
        
        Auswahl4Button.addSelectionListener(new SelectionListener(){
			public void widgetDefaultSelected(SelectionEvent e) {
				
			}
			
			// wird durchlaufen wenn der vierte Auswahlknopf ausgelöst wird
			public void widgetSelected(SelectionEvent e) {
    			
				for(int i = 0; i < con.length; i++) {
					// ändert die Schriftart auf Sans-Serif/fest
	    			aktSchriftgrad = con[i].getFont().getFontData()[0].getHeight();
	    			con[i].setFont(new Font(null, "Lucida Console", aktSchriftgrad, SWT.BOLD));
				}
			}
        });
        
        // Eigenschaften des MinusButtons
        MinusButton.setText("  -  ");
        MinusButton.addSelectionListener(new SelectionListener(){
			public void widgetDefaultSelected(SelectionEvent e) {
				
			}
			
			// wird durchlaufen wenn der Minus-Knopf ausgelöst wird
			public void widgetSelected(SelectionEvent e) {
				// reduzieren der Schriftgröße um 1, wenn Schriftgröße größer als 8
				
				if ((aktSchriftgrad > 8)){
					aktSchriftgrad = aktSchriftgrad - 1;
					aktSchriftart = con[0].getFont().getFontData()[0].getName();
					for(int i = 0; i < con.length; i++) {
						con[i].setFont(new Font(null, aktSchriftart, aktSchriftgrad, SWT.BOLD));
					}
				}
			}
        });
        
        // Eigenschaften des PlusButtons
        PlusButton.setText("  +  ");
        PlusButton.addSelectionListener(new SelectionListener() {
			public void widgetDefaultSelected(SelectionEvent e) {
			
			}
			
			// wird durchlaufen wenn der Plus-Knopf ausgelöst wird
			public void widgetSelected(SelectionEvent e) {
				// reduzieren der Schriftgröße um 1
				
				aktSchriftgrad = aktSchriftgrad + 1;
				aktSchriftart = con[0].getFont().getFontData()[0].getName();
				for(int i = 0; i < con.length; i++) {
					con[i].setFont(new Font(null, aktSchriftart, aktSchriftgrad, SWT.BOLD));
				}
			}
        });
        
        // Eigenschaften des DefaultButtons
        DefaultButton.setText("Standard");
        DefaultButton.addSelectionListener(new SelectionListener() {
			public void widgetDefaultSelected(SelectionEvent e) {
			
			}
			
			// wird durchlaufen wenn der Default-Knopf ausgelöst wird
			public void widgetSelected(SelectionEvent e) {
				// stellt den Defaultwert für die Schrift ein
				for(int i = 0; i < con.length; i++) {
					aktSchriftgrad = 10;
					con[i].setFont(StdSchriftart);
				}
			}
        });
	}
	
	public void widgetDefaultSelected() {
		
	}
	
	public void setFocus() {
        
	}
}
```



ich hab jetzt nach einigem tüfteln und rumprobieren nur noch zwei probleme...

1. ich möchte, dass sich die schriftgröße der titelleiste mitändert! und...
2. ich möchte, dass die buttons sich auch vergrößern, sobald die vergrößerte schrift den rand erreicht!


kennt jmd eine praktikable lösung für die beiden probleme?

lg


----------



## double_pi (19. Dez 2007)

ich weiß nicht, ob meine sich anschließende frage bei dem großen code-stück vielleicht überlesen wurde. deshalb zitiere ich das nochmal mit der bitte um konkrete hilfe oder ideen, wie man das angehen könnte...





			
				double_pi hat gesagt.:
			
		

> ich hab jetzt nach einigem tüfteln und rumprobieren nur noch zwei probleme...
> 
> 1. ich möchte, dass sich die schriftgröße der titelleiste mitändert! und...
> 2. ich möchte, dass die buttons sich auch vergrößern, sobald die vergrößerte schrift den rand erreicht!
> ...


----------



## double_pi (20. Dez 2007)

hallo forum,

hier ist nochmal die bitte um hilfe...




			
				double_pi hat gesagt.:
			
		

> ich hab jetzt nach einigem tüfteln und rumprobieren nur noch zwei probleme...
> 
> 1. ich möchte, dass sich die schriftgröße der titelleiste mitändert! und...
> 2. ich möchte, dass die buttons sich auch vergrößern, sobald die vergrößerte schrift den rand erreicht!
> ...




es wäre schön, wenn sich jmd dem problem annehmen könnte! vielen dank!


----------



## Marco13 (20. Dez 2007)

Die Schrift in der Titelleiste dürfte vom Betriebssystem abhängen, aber schau mal hier
http://forum.java.sun.com/thread.jspa?threadID=472936&messageID=2189851

Wenn die Schrift der Buttons geändert wurde, sollte sich auch ihre PreferredSize ändern. Man müßte evlt. nur ein neu-Layouten anstoßen, mit validate() evtl - hab' ich aber nicht getestet...


----------



## double_pi (20. Dez 2007)

Marco13 hat gesagt.:
			
		

> Die Schrift in der Titelleiste dürfte vom Betriebssystem abhängen, aber schau mal hier
> http://forum.java.sun.com/thread.jspa?threadID=472936&messageID=2189851
> 
> Wenn die Schrift der Buttons geändert wurde, sollte sich auch ihre PreferredSize ändern. Man müßte evlt. nur ein neu-Layouten anstoßen, mit validate() evtl - hab' ich aber nicht getestet...




hallo marco13,

erstmal danke dafür, dass du dir die zeit genommen hast und dich meinem problem gewidmet hast! :toll: 

ich hab mir den link angeguckt und festgestellt, dass das ein beispiel für swing ist! ich benutze aber SWT und das beispiel funktioniert bei mir so leider nicht und hilft mir leider auch nicht wirklich weiter! hast du da noch ein beispiel für SWT?

für meine buttons bekomme ich leider keine validate-methode zur auswahl! ich hab nochmal ein bisl rumprobiert und nur MinusButton.update() gefunden, was aber wiederum ein finales objekt verlangt, was ich ja so garnicht haben will.


hier nochmal der code wie die wichtigen buttons deklariert wurden:


```
// erstellt den Minus-Knopf
        Button MinusButton = new Button(parent, SWT.PUSH);
        // erstellt den Plus-Knopf
        Button PlusButton = new Button(parent, SWT.PUSH);
        // erstellt den Default-Knopf
        Button DefaultButton = new Button(parent, SWT.PUSH);
```


trotzdem vielen dank nochmal!


----------

