# Look and Feel ändern geht nicht, obwohl es geht.



## tobitobsen82 (2. Mai 2007)

Hallo Leute,

habe neben einigen andren Klassen eine MainKlasse, in der ich per Konstruktor ein Fenster mit einigen Elementen und einem Menü erzeuge. In dem Menü gibt es einen Menüpunkt "look and feel", in diesem man durch Klicken auf ein JMenuItem das LaF ändern können soll. 

Der ActionListener/Adapter funktioniert, da ich eine Ausgabe erhalte, die ich an dieser Stelle testesweise eingebaut habe. Die LaF-Ändern-Methode sollte eigentlich auch gehen, da ich das ganze mit einer try/catch Anweisung gemacht habe und keine Fehlermeldung erhalte. Einzig was nicht geht, scheint das tatsächliche Ändern zu sein. Bekomme keine gewünschte Windows-Metal-Motif Variante meines Fensters angezeigt, sondern lediglich den Standard und kleine Änderungen direkt im Menu, wenn ich z. B. auf Windows klicke. Allerdings nur auf dem Menüpunkt, den ich gerade dann angeklickt habe und auch in einer Variante, die mit Windows oder Motif reichlich wenig zu tun hat.

Was mache ich falsch?

Hier der Quellcode.

Danke für Eure Hilfe!


```
package listener;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.plaf.basic.BasicOptionPaneUI.ButtonActionListener;
import javax.swing.text.JTextComponent;
import javax.swing.JComponent;

public class Fenster{

	/**
	 * Dateiname: Fenster.java
	 * Compiler: Eclipse SDK 3.2.1
	 * Autor: Tobias Fickinger
	 * Erstellungsdatum: 17.04.07
	 * Letzte Änderung: 23.04.07
	 * Beschreibung des Moduls: Hauptprogramm zur Anzeige eines simplen Fensters ohne Ereignisse. Methoden werden größtenteils aus der Klasse FensterElemente bezogen
	 * Paket: fenster (zusammen mit: FensterElemente.java)
	 */
	public static void main(String[] args) {
		// Instanzierung des Fensterobjekts
		ReservierungsFenster fensterobjekt = new ReservierungsFenster();
		// Sichtbarkeit festlegen
		Menu menu = new Menu();
		fensterobjekt.setJMenuBar(menu.setMenuBar());
		fensterobjekt.setVisible(true);
	}	
}

class ReservierungsFenster extends JFrame{
	private static final long serialVersionUID = 1L;
	public JTextField nameField;
	public JTextField emailField;
	public JButton buttonOK;
	public JTextArea textArea;
	public String dateiPfad;
	public String textAreaContent;
	
	public ActionListener meinActionListener = new EventHandling();
	// Konstruktoren
	
	public ReservierungsFenster(){
		// Konstruktoraufruf mit Parameter für Titelname des Fensters
		this("Platzreservierung");
	}
	
	public ReservierungsFenster( String titel ){
		super(titel);
		setSize(420,400);
				
		//Elemente holen
		FensterElemente element = new FensterElemente();

		// Gridbaglayout holen
		
	    GridBagLayout gbl = new GridBagLayout();
	    GridBagConstraints constr = new GridBagConstraints();

	    // ContentPane holen
	    
	    Container cpane = this.getContentPane();
	    cpane.setLayout (new BorderLayout());
	    
	    // Panels holen und mit GridBagLayout versehen

	    JPanel topPanel = new JPanel();
	    JPanel downPanel = new JPanel ();
	    topPanel.setLayout(gbl);
	    downPanel.setLayout(gbl);
	    
	    // Panel "oben" mit Elementen aus der Klasse FensterElemente füllen
	    
	    //JLabel erstellen
	    constr.gridx = 1;	//Spalte
	    constr.gridy = 0;	//Zeile
	    constr.anchor = GridBagConstraints.CENTER;	    
	    topPanel.add(element.createJLabel("Sitzplatzreservierung"), constr);
	    
	    //JLabel erstellen
	    constr.gridx = 0;
	    constr.gridy = 1;
	    constr.anchor = GridBagConstraints.EAST;
	    topPanel.add(element.createJLabel("Name"), constr);
	    
	    //TextField erstellen
	    constr.gridx = 1;
	    constr.gridy = 1;
	    constr.anchor = GridBagConstraints.EAST;
	    nameField = element.createTextField(20);
	    topPanel.add(nameField, constr);	    
	    
	    //JLabel erstellen
	    constr.gridx = 0;
	    constr.gridy = 2;
	    constr.anchor = GridBagConstraints.EAST;
	    topPanel.add(element.createJLabel("Email"), constr);	    

	    //TextField erstellen
	    constr.gridx = 1;
	    constr.gridy = 2;
	    constr.anchor = GridBagConstraints.EAST;
	    emailField = element.createTextField(20);
	    topPanel.add(emailField, constr);
	    
	    //Button erstellen
	    constr.gridx = 2;
	    constr.gridy = 3;
	    constr.anchor = GridBagConstraints.WEST;
	    buttonOK = element.createButton("OK");
	    topPanel.add(buttonOK, constr);
	    EventHandling bl = new EventHandling(); 
	    buttonOK.addActionListener(bl);	    

	    //TextArea erstellen
	    constr.gridx = 1;
	    constr.gridy = 4;
	    constr.anchor = GridBagConstraints.CENTER;
	    textArea = element.createTextArea(3,19,textAreaContent);
	    topPanel.add(textArea, constr);  

	    //Panel "unten" mit Elementen aus der Klasse FensterElemente füllen

	    //RadioButtons erstellen
	    constr.gridx = 0;
	    constr.gridy = 1;
	    constr.anchor = GridBagConstraints.WEST;
	    String[] title = new String[]{"Raucher", "Nichtraucher"};
	    boolean[] active = new boolean[]{ true, false};
	    downPanel.add(element.createRadioButtons(title, active), constr);

	    //ComboBox erstellen
	    constr.gridx = 1;
	    constr.gridy = 1;
	    constr.anchor = GridBagConstraints.NORTHWEST;
	    String[] content = new String[]{"Fensterplatz","Mittelgang","Loge","Schlafplatz"};
	    downPanel.add(element.createComboBox(content), constr);
	    
	    //Leeres JLabel erstellen
        constr.gridx = 2;
        constr.gridy = 1;
        constr.anchor = GridBagConstraints.WEST;
        downPanel.add(element.createEmptyJLabel(30), constr);	    

        //Checkboxen erstellen
	    constr.gridx = 3;
	    constr.gridy = 1;
	    constr.anchor = GridBagConstraints.EAST;
	    constr.gridwidth = GridBagConstraints.REMAINDER;
	    String[] inhalt = new String[]{"Handgepäck","Koffer"};
	    boolean[] status = new boolean[]{false,true};
	    downPanel.add(element.createCheckBox(inhalt,status), constr);
	    
	    //Leeres JLabel erstellen
        constr.gridx = 0;
        constr.gridy = 2;
        constr.anchor = GridBagConstraints.WEST;
        downPanel.add(element.createEmptyJLabel(30), constr);
        
	    //Leeres JLabel erstellen
        constr.gridx = 0;
        constr.gridy = 3;
        constr.anchor = GridBagConstraints.WEST;
        downPanel.add(element.createEmptyJLabel(30), constr);
        
	    //Leeres JLabel erstellen
        constr.gridx = 0;
        constr.gridy = 4;
        constr.anchor = GridBagConstraints.WEST;        
        downPanel.add(element.createEmptyJLabel(30), constr);        
    
	    
	    // fertige topPanel und downPanel auf cpane legen
	    cpane.add(topPanel, BorderLayout.NORTH);
        cpane.add(downPanel, BorderLayout.SOUTH); 
	}
	class EventHandling implements ActionListener{
		public void actionPerformed(ActionEvent event){			
			if(event.getActionCommand().equals("OK")){
				String contentEmailField = emailField.getText();
				String contentNameField = nameField.getText();
				System.out.println("Name: " + contentNameField +
									"\nEmail: " + contentEmailField);
			}
			else if(event.getActionCommand().equals("Öffnen")){
				fileDialogOpen();
			}
			else if(event.getActionCommand().equals("Speichern")){
				fileDialogSave();				
			}
			else if(event.getActionCommand().equals("Beenden")){
				System.exit(0);				
			}
			else if(event.getActionCommand().equals("Windows")){
				System.out.println("Windows");
				updateLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
			}
			else if(event.getActionCommand().equals("Metal")){
				System.out.println("Metal");
				updateLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");				
			}
			else if(event.getActionCommand().equals("Motif")){
				System.out.println("Motif");
				updateLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");	
			}
			else if(event.getActionCommand().equals("Autor")){
				optionPane("Autor");
			}
			else if(event.getActionCommand().equals("Help")){
				optionPane("Help");				
			}
		}	
	}
	
	public void fileDialogOpen(){
		FileDialog dialogOpen = new FileDialog(this, "Datei laden...",FileDialog.LOAD);
		dialogOpen.show();
		dateiPfad = dialogOpen.getDirectory();
		dateiPfad += dialogOpen.getFile();
		if(dateiPfad == null){
			return;
		}
		else{
			textAreaContent = Datei.leseDaten(dateiPfad);
			System.out.println(textAreaContent);
		}
	}
	
	public void fileDialogSave(){
		String inhalt = textArea.getText();
		FileDialog dialogSave = new FileDialog(this, "Datei speichern...",FileDialog.SAVE);
		dialogSave.show();
		dateiPfad = dialogSave.getDirectory();
		dateiPfad += dialogSave.getFile();
		if(dateiPfad == null){
			return;
		}
		System.out.println(inhalt);
		Datei.schreibeDaten(dateiPfad, inhalt);
	}	
	
	public void optionPane(String type){
		if(type.equals("Autor")){
			JOptionPane.showMessageDialog(this, "Autor: Tobias Fickinger\n\nErstellt am: 28.04.2007\n\nVersion: 0.1","Information",JOptionPane.INFORMATION_MESSAGE);			
		}
		else if(type.equals("Help")){
			JOptionPane.showMessageDialog(this, "1. Menüführung\n" + 
											"1.1 Datei\n" +
											"\t1.1.1 Öffnen: Klicken Sie hier, um eine Datei zu öffnen\n" +
											"\t1.1.2 Speichern: Klicken Sie hier, um eine Datei zu speichern\n" +
											"\t1.1.3 Beenden: Klicken Sie hier, um das Programm zu beenden\n" +
											"\t1.2 look&feel\n" +
											"\t1.2.1 Windows: Windows-Ansicht\n" +
											"\t1.2.2 Metal: Metal-Ansicht\n" + 
											"\t1.2.3 Motif: Motif-Ansicht\n" +
											"\t1.3 Info\n" + 
											"\t1.3.1 Autor: Informationen zum Programm anzeigen\n" + 
											"\t1.3.2 Help: Hilfemenu anzeigen\n","Hilfemenü",JOptionPane.INFORMATION_MESSAGE);
		}
		
	}
	
	public void updateLookAndFeel(String laf){
		try{
			UIManager.setLookAndFeel(laf);
			SwingUtilities.updateComponentTreeUI(this);
		}
		catch(Exception xcpt){
			System.out.println("Fehler beim Ändern des Look and Feel: " + xcpt.getLocalizedMessage());
		}
		this.pack();
	}
	
}//Ende der Klasse ReservierungsFenster
```


----------



## Wildcard (2. Mai 2007)

Du musst den Component Tree updaten wenn du das Look'n'Feel zur Laufzeit wechselst.
http://java.sun.com/javase/6/docs/a...tml#updateComponentTreeUI(java.awt.Component)


----------



## tobitobsen82 (3. Mai 2007)

Mache ich das nicht bereits in meiner Methode "updateLookAndFeel (Zeile 265 ff)?


----------

