Não é de hoje que temos visto que o Java evolui a olhos vistos, apesar de muitos de nossos colegas de profissão falarem mal do Java dizendo que programação GUI nesta linguagem tem sido assaz complicada e bastante confusa. Porém, nem tudo são espinhos, o Swing veio em substituição ao AWT, o que nos diz que sempre houve evolução na plataforma SE. Pois então, agora temos outra novidade para Look and Feel para ser utilizada com o Swing e o que melhora.

Diante desta onda de Look and Feels existentes na Internet, sempre utilizei esta Look desde que fora publicada, a Nimbus.

Para aplicar a Nimbus é muito simples, basta adicionar o seguinte trecho em seu código:

try {
    for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
        if ("Nimbus".equals(info.getName())) {
            UIManager.setLookAndFeel(info.getClassName());
            break;
        }
    }
} catch (UnsupportedLookAndFeelException e) {
    // handle exception
} catch (ClassNotFoundException e) {
    // handle exception
} catch (InstantiationException e) {
    // handle exception
} catch (IllegalAccessException e) {
    // handle exception
}
Listagem 1. Aplicando a Nimbus

Ou se quiser, pode ser via Linha de Comando durante a execução de sua aplicação:

-Dswing.defaultlaf=com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel
Listagem 2. Aplicação da Nimbus por linha de comando

Porém, para facilitar eu criaei uma Singleton com um método estático:

import javax.swing.UIManager;

import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.UnsupportedLookAndFeelException;
/**
 * Classe de Aplicação do Look and Feel GUI
 * Nimbus
 * @author Gabriel
 *
 */
public class AplicaNimbusLookAndFeel {
		
	private AplicaNimbusLookAndFeel() {
		
	}
	public static void pegaNimbus() {
		try {
		    for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
		        if ("Nimbus".equals(info.getName())) {
		            UIManager.setLookAndFeel(info.getClassName());
		            break;
		        }
		    }
		} catch (UnsupportedLookAndFeelException e) {
			
		    System.out.println("Erro: " + e.getMessage());
		    e.printStackTrace();
		    
		} catch (ClassNotFoundException e) {
			
			System.out.println("Erro: " + e.getMessage());
		    e.printStackTrace();
		    
		} catch (InstantiationException e) {
			
			System.out.println("Erro: " + e.getMessage());
		    e.printStackTrace();
		    
		} catch (IllegalAccessException e) {
			
			System.out.println("Erro: " + e.getMessage());
		    e.printStackTrace();
		}
	}
}
Listagem 3. Singleton com método estático para aplicação da Nimbus

Neste ponto você já deve estar interessado em saber como ficou a aparência da aplicação, diante desta curiosidade, vou mostrar aqui um exemplo de como é a aparência deste Look And Feel:

Aparência da Nimbus
Figura 1. Aparência da Nimbus

O código aqui exposto pode ser utilizado para aplicar qualquer Look And Feel que você deseje em suas aplicações.

Mostro agora a diferença e entre uma JOptionPane com o Motif - Look padrão do Swing - e outra com o Nimbus.

JOptionPane com aparência do Motif
Figura 2. JOptionPane com aparência do Motif
JOptionPane com aparência da Nimbus
Figura 3. JOptionPane com aparência da Nimbus

Viu só a diferença? Espero que lhe auxilie no design de seus formulários.

Copio abaixo, o código fonte do aplicativo retirado do Livro Java - Como Programar, dos Irmãos Deitel e da Editora Pearson apenas como exemplo para uma “degustação" da Nimbus. Posto que até os irmãos Deitel o adotaram na 8ª edição deste livro.

public class Soma {

public static void main(String[] args){

	//Aplica o Nimbus

	AplicaNimbusLookAndFeel.pegaNimbus();		

	//Obtém a entrada de usuário a partir dos diálogos de entrada JOptionPane
	String primeiroNumero = JOptionPane.showInputDialog("Entre o primeiro numero Inteiro: ");

	String segundoNumero = JOptionPane.showInputDialog("Entre o segundo numero Inteiro: ");		

	//Converte String em valores int para a utilizado em um calculo
	Integer numero1 = Integer.parseInt(primeiroNumero);
	Integer numero2 = Integer.parseInt(segundoNumero);		

	Integer soma = numero1 + numero2;		

	//Exibe o resultado em um diálogo de mansagem JOptionPane
	//Icones para JOptionPane
	//Usando a Classe JOptionPane
	JOptionPane.showMessageDialog(null,"A soma e: " + soma,
                         "Soma entre dois inteiros",JOptionPane.PLAIN_MESSAGE);

}//Fim do método Main



}//Fim da Classe Soma

- Singleton para aplicação do Nimbus:
public class AplicaNimbusLookAndFeel {

private AplicaNimbusLookAndFeel() {
}
public static void pegaNimbus() {
	try {
	    for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
	        if ("Nimbus".equals(info.getName())) {
	            UIManager.setLookAndFeel(info.getClassName());
	            break;
	        }
	    }
	} catch (UnsupportedLookAndFeelException e) {
		
	    System.out.println("Erro: " + e.getMessage());
	    e.printStackTrace();
	    
	} catch (ClassNotFoundException e) {
		
		System.out.println("Erro: " + e.getMessage());
	    e.printStackTrace();
	    
	} catch (InstantiationException e) {
		
		System.out.println("Erro: " + e.getMessage());
	    e.printStackTrace();
	    
	} catch (IllegalAccessException e) {
		
		System.out.println("Erro: " + e.getMessage());
	    e.printStackTrace();
	}
}
Listagem 4. Trecho de código que utiliza o Look And Feel