Ventanas con estilo gracias a Substances

10/Oct/2010 Java , , , , 3 Comentarios

Hoy explicaré en simples pasos cómo usar Substance en nuestras aplicaciones, que de hecho es una muy buena forma de darle estilo a nuestras ventanas

¿Que haremos?

Crearemos una ventana simple(JFrame, JTextField, JButton) a código. Sin ayuda de Netbeans u otro programa que solo tienes que arrastrar componentes, que de hecho es una muy buena forma, pero el motivo es enseñar.

Primero que todo haremos una nueva clase llamada "JVentana" que como el nombre lo indica tendrá lo suficiente para crear una ventana y también incluiremos un evento al botón:

  1. public final class JVentana{
  2. ...}

Ahora agregamos 3 atributos de tipo JFrame, JTextField, JButton:

  1. private JFrame Frame_principal;
  2. private JTextField textField_texto;
  3. private JButton button_saludo;

Siguiendo de lo antes realizado agregaremos un método llamado "inicializar", que inicializará los atributos que declaramos anteriormente:

  1. public void inicializar(){
  2. Frame_principal = new JFrame("Sethcrofts para http://www.lineadecodigo.com");
  3. textField_texto = new JTextField();
  4. textField_texto.setColumns(40);
  5. button_saludo = new JButton("Saludar");
  6. }

Explicación del método inicializar:

  1. Creamos el JFrame asigándole un nombre en su constructor
  2. Creamos el JTextField
  3. Seteamos el JTextField para que sea mas largo (por columnas)
  4. Creamos el JButton

Siguiendo lo anterior iremos a crear otro método llamado "agregarComponentes":

  1. public void agregarComponentes(){
  2. Frame_principal.add(textField_texto);
  3. Frame_principal.add(button_saludo);
  4. Frame_principal.setLayout(new FlowLayout());
  5. Frame_principal.setVisible(true);
  6. Frame_principal.setResizable(false);
  7. Frame_principal.pack();
  8. }

Explicación del método agregarComponentes:

  1. Agregamos el JTextField creado al FramePrincipal
  2. Agregamos el JButton creado al FramePrincipal
  3. Seteamos nuestra ventana principal al modo FlowLayout (Alterará la forma en que se ubicarán los componentes en el Frame)
  4. Hacemos visible la ventana principal
  5. Seteamos la opción de redimensionar la ventana (true=SI, false=NO)
  6. Seteamos la ventana principal, para que se adapte al tamaño de nuestros componentes para evitar espacios innesesarios

Ahora lo que nos queda hacer por último es programar nuestro evento para que al hacer click en el botón se genere un mensaje:

  1. public void asignarEventos(){
  2. button_saludo.addActionListener(new ActionListener() {
  3. public void actionPerformed(ActionEvent e) {
  4. if(textField_texto.getText().equalsIgnoreCase("")){
  5. JOptionPane.showMessageDialog(null, "Ingrese un nombre.");
  6. }else{
  7. JOptionPane.showMessageDialog(null, "Hola: "+textField_texto.getText());
  8. }
  9. }
  10. });
  11. }

Explicación del método asignarEventos:

  1. Asignamos un evento (ActionListener) al botón (button_saludo), como su nombre lo indica escuchará cada vez que se presione.
  2. Agregamos el método actonPerformed (Si usas Netbeans esa parte se hace por defecto, así que solo tendrás que asignar instrucciones)
  3. Preguntamos que si el textField_texto está vacio que realize la siguiente acción
  4. Desplegamos un mensaje en pantalla (como un alert() en Javascript, MessageBox en .NET )
  5. Si no es así, entonces saludará al nombre ingresado en el text

Y bueno ya casi terminando crearemos nuestro constructor:

  1. public JVentana(){
  2. inicializar();
  3. agregarComponentes();
  4. asignarEventos();
  5. }

Explicación del constructor:

  1. Llamamos al método inicializar
  2. Llamamos al método agregarComponentes
  3. Llamomos al método asignarEventos

Es importante la posición en que pones las llamada a los métodos, porque si pones por ejemplo agregarComponentes se generará un error ya que aún no se han creado los componente

Nuestra clase sería verse algo así :

  1.  
  2. package ejemplosubstance;
  3.  
  4. import java.awt.FlowLayout;
  5. import java.awt.event.ActionEvent;
  6. import java.awt.event.ActionListener;
  7. import javax.swing.JButton;
  8. import javax.swing.JFrame;
  9. import javax.swing.JOptionPane;
  10. import javax.swing.JTextField;
  11.  
  12. public final class JVentana{
  13.  
  14. private JFrame Frame_principal;
  15. private JTextField textField_texto;
  16. private JButton button_saludo;
  17.  
  18. public JVentana(){
  19. inicializar();
  20. agregarComponentes();
  21. asignarEventos();
  22. }
  23.  
  24. public void inicializar(){
  25. Frame_principal = new JFrame("Sethcrofts para http://www.lineadecodigo.com");
  26. textField_texto = new JTextField();
  27. textField_texto.setColumns(40);
  28. button_saludo = new JButton("Saludar");
  29. }
  30.  
  31. public void agregarComponentes(){
  32. Frame_principal.add(textField_texto);
  33. Frame_principal.add(button_saludo);
  34. Frame_principal.setLayout(new FlowLayout());
  35. Frame_principal.setVisible(true);
  36. Frame_principal.setResizable(false);
  37. Frame_principal.pack();
  38. }
  39.  
  40. public void asignarEventos(){
  41. button_saludo.addActionListener(new ActionListener() {
  42. public void actionPerformed(ActionEvent e) {
  43. if(textField_texto.getText().equalsIgnoreCase("")){
  44. JOptionPane.showMessageDialog(null, "Ingrese un nombre.");
  45. }else{
  46. JOptionPane.showMessageDialog(null, "Hola: "+textField_texto.getText());
  47. }
  48. }
  49. });
  50. }
  51. }

Luego que tengamos todo listo viene la parte principal de éste tutorial por así decirlo "darle estilo a nuestras ventanas". Para ellos vamos a utilizar Substances.

Lo primero que tenemos que hacer es descargarnos el jar de Substances.

Descargar Substances Version: 5.3

Luego que lo tenemos descargado lo añadimos al proyecto, desconosco la manera en que algunas aplicaciones hacen éste proceso pero Netbeans lo hace de la siguiente manera

  1. Botón derecho sobre Libraries
  2. Add Jar/Folder (Agregar JAR / Carpeta)
  3. Buscamos y seleccionamos nuestro JAR descargado

Luego lo único que tenemos que hacer es nuestro honorable MAIN que quedaría de la siguiente manera:

  1. public static void main(String[] args) {
  2. java.awt.EventQueue.invokeLater(new Runnable() {
  3. public void run() {
  4. try {
  5. Frame.setDefaultLookAndFeelDecorated(true);
  6. SubstanceLookAndFeel.setSkin("org.jvnet.substance.skin.OfficeSilver2007Skin");
  7. new JVentana();
  8. } catch (Exception e) {
  9. JOptionPane.showMessageDialog(null, "Error: "+e);
  10. }
  11. }
  12. });
  13. }

Explicaré la dos lineas que son nuevas para ustedes. Sí, "JFrame.setDefaultLookAndFeelDecorated" y "SubstanceLookAndFeel.setSkin"

  1. La primera setea el Frame que vendrá luego a que adopte el decorado de Subtances y que decorado tendrá.
  2. Bueno la segunda linea de encarga del decorado en éste caso es "officeSilver2007Skin"

Si todo va bien deberíamos ver algo así

Vídeos sobre Java


Difunde el Conocimiento

Si te ha gustado el artículo o te ha sido de utilidad, no dejes de compartirlo con tus amigos en las redes sociales... Te estaremos muy agradecidos. :-D

3 comentarios en “Ventanas con estilo gracias a Substances”

Pablo Ruiz

manuel

Exception in thread “main” java.lang.NullPointerException
at org.jvnet.substance.SubstanceDefaultListCellRenderer.getListCellRendererComponent(SubstanceDefaultListCellRenderer.java:69)
at org.jvnet.substance.SubstanceDefaultComboBoxRenderer.getListCellRendererComponent(SubstanceDefaultComboBoxRenderer.java:88)
at org.jvnet.substance.SubstanceComboBoxUI.getDefaultSize(SubstanceComboBoxUI.java:244)
at javax.swing.plaf.basic.BasicComboBoxUI.getDisplaySize(BasicComboBoxUI.java:1368)
at javax.swing.plaf.basic.BasicComboBoxUI.getBaseline(BasicComboBoxUI.java:955)
at javax.swing.JComponent.getBaseline(JComponent.java:2560)
at javax.swing.GroupLayout$ComponentSpring.getBaseline(GroupLayout.java:3075)
at javax.swing.GroupLayout$BaselineGroup.calculateBaselineAndResizeBehavior(GroupLayout.java:2732)
at javax.swing.GroupLayout$BaselineGroup.calculateSize(GroupLayout.java:2708)
at javax.swing.GroupLayout$Group.calculatePreferredSize(GroupLayout.java:1602)
at javax.swing.GroupLayout$Spring.getPreferredSize(GroupLayout.java:1346)
at javax.swing.GroupLayout$Group.getSpringSize(GroupLayout.java:1638)
at javax.swing.GroupLayout$Group.calculateSize(GroupLayout.java:1627)
at javax.swing.GroupLayout$Group.calculatePreferredSize(GroupLayout.java:1602)
at javax.swing.GroupLayout$Spring.getPreferredSize(GroupLayout.java:1346)
at javax.swing.GroupLayout$Group.getSpringSize(GroupLayout.java:1638)
at javax.swing.GroupLayout$Group.calculateSize(GroupLayout.java:1622)
at javax.swing.GroupLayout$Group.calculatePreferredSize(GroupLayout.java:1602)
at javax.swing.GroupLayout$Spring.getPreferredSize(GroupLayout.java:1346)
at javax.swing.GroupLayout$Group.getSpringSize(GroupLayout.java:1638)
at javax.swing.GroupLayout$Group.calculateSize(GroupLayout.java:1622)
at javax.swing.GroupLayout$Group.calculatePreferredSize(GroupLayout.java:1602)
at javax.swing.GroupLayout$Spring.getPreferredSize(GroupLayout.java:1346)
at javax.swing.GroupLayout.calculateAutopadding(GroupLayout.java:1071)
at javax.swing.GroupLayout.prepare(GroupLayout.java:1059)
at javax.swing.GroupLayout.preferredLayoutSize(GroupLayout.java:878)
at java.awt.Container.preferredSize(Container.java:1788)
at java.awt.Container.getPreferredSize(Container.java:1773)
at javax.swing.JComponent.getPreferredSize(JComponent.java:1662)
at org.jvnet.substance.SubstanceRootPaneUI$SubstanceRootLayout.preferredLayoutSize(SubstanceRootPaneUI.java:772)
at java.awt.Container.preferredSize(Container.java:1788)
at java.awt.Container.getPreferredSize(Container.java:1773)
at javax.swing.JComponent.getPreferredSize(JComponent.java:1662)
at java.awt.BorderLayout.preferredLayoutSize(BorderLayout.java:719)
at java.awt.Container.preferredSize(Container.java:1788)
at java.awt.Container.getPreferredSize(Container.java:1773)
at java.awt.Window.pack(Window.java:808)
at Display.login.initComponents(login.java:123)
at Display.login.(login.java:15)
at logica.Huellita.main(Huellita.java:17)

Con un formulario ya hecho me sale este error si alguien me puede colaborar

¿Algo que nos quieras comentar?

Déjanos tu comentario, no te preocupes que tu email no será publicado

*

*