Aparências de interface - Look and Feel

Java

09/04/2009

[b]Aparências de interface - Look and Feel[/b] Por Cleuber Batista Silva A GUI (graphical user interface) foi um dos elementos que revolucionaram a computação nesta era, Java fornece métodos para que se possa construir sistemas multiplataforma não tendo que rescrever ou trocar a linguagem de programação conforme a utlização de uma outra plataforma para a aplicação desenvolvida. [b]- O que é Look and Feel ?[/b] Look and Feel é a aparência que sua aplicação irá tomar. o Look and Feel (aparência e comportamento)define a forma como seus componentes serão desenhados na tela. [b]- Como faço para selecionar um Look and Feel ?[/b] Deve-se selecionar um Look and Feel antes de criar a interface gráfica, podemos utlizar o método [b]UIManager.setLookAndFeel(LookandFeel) [/b]para definir qual será utlizado. [b]- Métodos úteis :[/b] [b]UIManager.getCrossPlatformLookAndFeelClassName()[/b] - retorna um objeto com o padrão java, que funciona em todas as plataformas. [b]UIManager.getSystemLookAndFeelClassName()[/b] - retorna um objeto que representa a aparência do sistema onde o programa está rodando. [b]- Alguns LookAndFeel´s :[/b] [list]com.sun.java.swing.plaf.gtk.GTKLookAndFeel - padrão GTK+ javax.swing.plaf.metal.MetalLookAndFeel - Metal com.sun.java.swing.plaf.windows.WindowsLookAndFeel - Windows com.sun.java.swing.plaf.motif.MotifLookAndFeel - Motif javax.swing.plaf.mac.MacLookAndFeel - Mac[/list]
OB.: ALguns Look And Feel´s podem levantar um exceção, por não existirem, ou não estarem instalados no sistema, ou não serem suportados em determinadas plataformas. É importante resalvar também que a depender do layout utilizado uma determinada aplicação pode ter problemas de aparência, por que tamanhos de botões, caixas de texto e outros componentes variam de plataforma para plataforma, e podem fazer com que a aparência de uma aplicação fique desorganizada.
[b] - Um exemplo ( LFDemo.java )[/b] Neste tutorial vamos construir uma aplicação que pega todos os Look And Feel´s instalados e fornece ao usuário a oportunidade de trocá-los. Esta parte do código pega o LAF´s instalados e os mostra como componentes Radio :
        for (int i = 0; i < looks.length; i++){
        escolha[i] = new JRadioButton( looks[i].getName() );
Esta parte do código "seta" um Look And Feel e também atualiza com o [b]SwingUtilities.updateComponentTreeUI(this)[/b], fazendo com que a aparência seja carregada em modo de execução de uma aplicação.
        public void atualiza(int i){
          try {
          UIManager.setLookAndFeel(looks[i].getClassName());
          SwingUtilities.updateComponentTreeUI(this);
          }catch(Exception e) {
          e.printStackTrace();
          }
        }
Agora toda a classe :
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class LFDemo extends JFrame{
        private UIManager.LookAndFeelInfo[] looks = 
UIManager.getInstalledLookAndFeels();
        private JLabel lbLabel01 = new JLabel("Nome :");
        private JLabel lbLabel02 = new JLabel("E-mail :");
        private JTextField jtTexto01 = new JTextField( 10 );
        private JTextField jtTexto02  = new JTextField( 10 );
        private JButton jbOk = new JButton("Enviar");
        private JButton jbLim = new JButton("Limpar");
        private JRadioButton[] escolha = new JRadioButton[  looks.length ];
        private ButtonGroup grupo = new ButtonGroup();


        public static void main( String[] args ){
        LFDemo lfd = new LFDemo();
        lfd.show();
        }

        public LFDemo(){
        super("Selecione um LF");
        Container c = getContentPane();
        c.setLayout ( new FlowLayout());
        c.add(lbLabel01);
        c.add(jtTexto01);
        c.add(lbLabel02);
        c.add(jtTexto02);
        c.add(jbOk);
        c.add(jbLim);
        ItemSelecionado iselect = new ItemSelecionado();
        for (int i = 0; i < looks.length; i++){
        escolha[i] = new JRadioButton( looks[i].getName() );
        escolha[i].addItemListener( iselect );
        grupo.add( escolha[i] );
        c.add( escolha[i] );
        }
        escolha[2].setSelected( true );
        setDefaultCloseOperation( EXIT_ON_CLOSE );
        setSize(200,250);
        }

        public void atualiza(int i){
          try {
          UIManager.setLookAndFeel(looks[i].getClassName());
          SwingUtilities.updateComponentTreeUI(this);
          }catch(Exception e) {
          e.printStackTrace();
          }
        }

  private class ItemSelecionado implements ItemListener {
          public void itemStateChanged( ItemEvent e) {
            for (int i=0; i < escolha.length; i++){
            if (escolha[i].isSelected())
              atualiza(i);
            }
          }
  }
}
Depois é só compilar e rodar :) Espero que este tutorial seja apreciado por todos, pode-se também encontrar vários Look And Feel na internet abaixo um site interessante que contém vários LAF´s para você usar: http://www.jdance.com/lookandfeel.shtm Links sobre look and feel: [url=http://java.sun.com/products/jlf/ed2/book/index.html]Java Look and Feel Design Guidelines[/url] [url=http://java.sun.com/products/jlf/at/book/index.html]Java Look and Feel Design Guidelines: Advanced Topics[/url] [url=http://java.sun.com/developer/techDocs/hi/repository/]Java look and feel Graphics Repository[/url] [url=http://java.sun.com/developer/techDocs/hi/jlf.html]Papers on Java Software Human Interface Issues and More[/url] :!: Cleuber Batista Silva cleuber_s@hotmail.com
Vitor Pamplona

Vitor Pamplona

Curtidas 0

Respostas

Ricardo

Ricardo

09/04/2009

Muito bala este tutorial, eu já tinha ouvido várias vezes sobre isso, mas nunca tinha me interessado... ótimo este tutorial
GOSTEI 0
Nélio Mesquita

Nélio Mesquita

09/04/2009

Será que eu posso fazer isso, mas utilizando menu itens ao inves de radio buttons?
GOSTEI 0
Jairo Luiz

Jairo Luiz

09/04/2009

Olá, muito bom mesmo... consegui fazer utilizando JComboBox.... Ficou muito bom! valewww :evil:
GOSTEI 0
Leonardo Moreira

Leonardo Moreira

09/04/2009

Coloquei um Skin na minha aplicação, ficou mto legal, mas.....as telas e componentes ficaram maiores e passaram a nao caber. Como resolver isso..Vlw
GOSTEI 0
Pcmnac

Pcmnac

09/04/2009

Criei recentemente um componente para deixar essa interação bem fácil. Usando ele fica bem tranquilo fazer esse esquema de mudar de look. É um component opensource e tá no googlecode. http://code.google.com/p/easylookandfeel/ :!:
GOSTEI 0
Jonatas Moraes

Jonatas Moraes

09/04/2009

Bom dia pessoa! o seguinte tentei usa lookandfeel da mac que voce da de exemplo soh que nao deu certo!sera que pelo fato de ser da aplle nao roda em windows? ou tem algo de errado no meu codigo!!?
public class LookAndFeel extends JPanel implements ActionListener {
    
    private JButton metalButton = new JButton("Metal");

    private JButton motifButton = new JButton("Motif");

    private JButton windowsButton = new JButton("Windows");

    private JButton macButton = new JButton("Mac");

    public LookAndFeel() {

      add(metalButton);
      add(motifButton);
      add(windowsButton);
      add(macButton);

      metalButton.addActionListener(this);
      motifButton.addActionListener(this);
      windowsButton.addActionListener(this);
      macButton.addActionListener(this);
      
    }

    public void actionPerformed(ActionEvent evt) {
      Object source = evt.getSource();
      String plaf = "";
      if (source == metalButton)
        plaf = "javax.swing.plaf.metal.MetalLookAndFeel";
      else if (source == motifButton)
        plaf = "com.sun.java.swing.plaf.motif.MotifLookAndFeel";
      else if (source == windowsButton)
        plaf = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
      else if (source == macButton)
        plaf = "javax.swing.plaf.mac.MacLookAndFeel.Mac";
      try {
        UIManager.setLookAndFeel(plaf);
        SwingUtilities.updateComponentTreeUI(this);
      } catch (Exception e) {
      }
    }

  }
GOSTEI 0
Carlos Heuberger

Carlos Heuberger

09/04/2009

se o programa não funciona, voce deveria no mínimo mandar imprimir as Exceptions em vez de ignorá-las.
...
try {
  UIManager.setLookAndFeel(plaf);  
  SwingUtilities.updateComponentTreeUI(this);  
} catch (Exception e) {  
  e.printStackTrace();
}
...
deve exibir algo como: ClassNotFoundException: javax.swing.plaf.mac.MacLookAndFeel.Mac indicando que não encontrou a classe em questão, ou seja, ela não está instalada, deve vir somente nos sistemas da Apple. (provavelmente usa recursos do sistema operacional) []]
GOSTEI 0
Davi Pereira

Davi Pereira

09/04/2009

Bom artigo! :P :amigos:
GOSTEI 0
Davi Pereira

Davi Pereira

09/04/2009

Ótimo artigo !!!
GOSTEI 0
POSTAR