Problemas com Look & Feel Dinâmico

3 respostas
Ironlynx

Dado o seguinte código:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.JMenuItem;
import javax.swing.JMenuBar;
import javax.swing.KeyStroke;

import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;
import javax.swing.JFrame;

import javax.swing.UIManager.*;
import javax.swing.plaf.metal.DefaultMetalTheme;
import javax.swing.plaf.metal.MetalLookAndFeel;

public class TesteLF implements ActionListener,ItemListener{
	private JFrame frame = null;
	
	//itens da Barra de Menus
   JMenuBar menuBar;
   JMenu menu;   
   JMenuItem menuItem;
   JRadioButtonMenuItem[] rbMenuItem=new JRadioButtonMenuItem[3];
   ButtonGroup group;
   JTextArea saida;
   JScrollPane scroll;
   
    // Aparências(aspectos de Tela) possíveis  
    private static final String metal    =
            "javax.swing.plaf.metal.MetalLookAndFeel";
    private static final String motif    =
            "com.sun.java.swing.plaf.motif.MotifLookAndFeel";
    private static final String windows  =
            "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
            
    /*
    *@method criaMenu()-método responsável pela criação da Barra de Menus
    */   
   public JMenuBar criaMenu(){    
   
       //Cria a barra de menu.
        menuBar = new JMenuBar();
        
   //Constrói o primeiro menu
        menu = new JMenu("Aparência");//cabeçalho do primeiro menu
        menu.setMnemonic(KeyEvent.VK_A);
        menu.getAccessibleContext().setAccessibleDescription(
                "Dados De Arquivo");
        menuBar.add(menu);//adiciona o primeiro menu a barra de menus 
        
      group = new ButtonGroup();      
      rbMenuItem[0]= new JRadioButtonMenuItem("Java Look and Feel");
        rbMenuItem[0].setSelected(true);
        rbMenuItem[0].setMnemonic(KeyEvent.VK_B);
        group.add(rbMenuItem[0]);
        rbMenuItem[0].addActionListener(this);//ouvinte de evento para o radioButton
        menu.add(rbMenuItem[0]);
        
        rbMenuItem[1] = new JRadioButtonMenuItem("Motif Look and Feel");
        rbMenuItem[1].setMnemonic(KeyEvent.VK_C);
        group.add(rbMenuItem[1]);
        rbMenuItem[1].addActionListener(this);
        menu.add(rbMenuItem[1]);
      
         rbMenuItem[2] = new JRadioButtonMenuItem("Windows Look and Feel");
        rbMenuItem[2].setMnemonic(KeyEvent.VK_D);
        group.add(rbMenuItem[2]);
        rbMenuItem[2].addActionListener(this); 
        menu.add(rbMenuItem[2]); 
        
        return menuBar;
        
      }
      
      public void actionPerformed(ActionEvent e) {
   	    
   	    if(e.getSource()==rbMenuItem[0])
   	       mudaAparencia(metal);
   	    else if(e.getSource()==rbMenuItem[1])
   	       mudaAparencia(motif);
   	    else if(e.getSource()==rbMenuItem[2])
   	       mudaAparencia(windows);
   	    }
   
   public void itemStateChanged(ItemEvent e) {
      /*
      if(rbMenuItem[0].isSelected()){
      	 mudaAparencia(metal);
      else if(rbMenuItem[1].isSelected())
      	  mudaAparencia(motif);  
      else if(rbMenuItem[2].isSelected())
          mudaAparencia(windows);
      */              
    }
    
    /************Métodos para alterar o Look & Feel da Aplicação**********************/
    
    /*
     * @method mudaAparencia mudará a aparência da tela 
     */   
   public void mudaAparencia(String aparencia){
   	    
     
     try {
        UIManager.setLookAndFeel(aparencia);
        SwingUtilities.updateComponentTreeUI(frame);    
     }
     catch (InstantiationException e) {  
       e.printStackTrace();    	
     }
     catch (ClassNotFoundException e) {
       e.printStackTrace(); 	
     }
     catch (UnsupportedLookAndFeelException e){
       e.printStackTrace(); 	
     }
     catch (IllegalAccessException e) {
       e.printStackTrace(); 	
       }
      
      
      //  frame.repaint();
      //  frame.pack();                
                                               }//fim de mudaAparencia()
       public Container criaContentPane() {
        //Cria o panel
        JPanel contentPane = new JPanel(new BorderLayout());
        contentPane.setOpaque(true);

        //Cria uma text area rolável.
        saida = new JTextArea(5, 30);
        saida.setEditable(false);
        scroll = new JScrollPane(saida);

        //Adicona a textarea content pane.
        contentPane.add(scroll, BorderLayout.CENTER);

        return contentPane;
       }
       
      private void exibeTela(){
   	//Decora a janela.
        JFrame.setDefaultLookAndFeelDecorated(true);

        //Cria e seta a janela.
        frame = new JFrame("Teste de Look&Feel Dinâmico");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Cria uma instancia de classe e seta o content pane.
        TesteLF tlf=new TesteLF();
        frame.setJMenuBar(tlf.criaMenu());
        frame.setContentPane(tlf.criaContentPane());

        //mostra a janela.
        frame.setSize(450, 260);
        frame.setVisible(true);
        //centraliza o frame na tela
        frame.setLocationRelativeTo(null);
   	
       }//fim de exibeTela()
       
      public static void main(String[] args) {
   	       final TesteLF tlf=new TesteLF();//cria uma instância da Classe
   	
        //Agenda um trabalho para o event-dispatching thread:
        //cria e mostra a aplicação GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                tlf.exibeTela();
            }
        });
   }//fim do main()
	
 }//fim da classe TesteLF

O L&F não se altera de modo algum!Dá uns erros de thread dispatch!
Alguém sabe pq isso acontece? :?

3 Respostas

dukejeffrie

Hmmm… acho que vc tá na Thread errada.

C tem certeza de que seu método tá sendo executado da AWT-Dispatcher??

Muito mais importante que o código é vc dar a exception…

Olhei o demo que vem com o JDK, SwingSet2, e ele faz exatamente isso que vc fez…

[]s!

A

mude o

TesteLF tlf=new TesteLF(); 
		frame.setJMenuBar(tlf.criaMenu()); 
		frame.setContentPane(tlf.criaContentPane());

pra

frame.setJMenuBar(this.criaMenu()); 
		frame.setContentPane(this.criaContentPane());

no exibeTela()

Ironlynx

Valeu Axel Foley!Não atentei para o óbvio(referênciar o próprio objeto em questão! ao invés de criar uma instância de classe)…e também não tava conseguindo ver…apenas dei uma rápida adaptada para postar no fórum,mas o código original é quase 20vezes maior q esse, tava foda de enxergar,mas o chato eh q (ao que parece) a barra de títulos decorada da problema em alguns L&F…mesmo assim valeu! :smiley:

Criado 16 de abril de 2004
Ultima resposta 16 de abr. de 2004
Respostas 3
Participantes 3