Java

Java Swing 5: Preparando el menú para estas Navidades…

2012-12-20 - Categorías: Java / Java Swing
¡Hola de nuevo!

Estoy pegándole un repaso a todo lo referente a los menús con Swing usando Eclipse. No deja de sorprenderme lo fácil y rápido que lo tenemos una vez que te has familiarizado con Eclipse, y en concreto con el Swing Designer. En pocos minutos tenemos nuestro esqueleto de la aplicación listo para codificar sus funciones o encajarlo con códigos ya hechos, cada uno para lo que lo necesite…


Para todo ésto he usado la zona del Swing Designer que vemos a continuación:

Jugando con los componentes donde pone ‘Menu’ podemos hacer todo lo referente. Un JMenuBar es una barra de menús, es la típica barra de menús que sale normalmente en la zona de arriba de un programa con Archivo, Opciones, Ayuda, etcétera… Tenemos que poner uno en el JFrame para entonces, dentro de éste JMenuBar, podamos poner los JMenu o JMenuItem que queramos. Dentro de un JMenu podemos poner otros JMenu o elementos finales de tipo JMenuItem, JCheckBoxMenuItem, JRadioButtonMenuItem o en especial el JSeparator que simplemente es una línea separadora como la siguiente después de ‘Poner título’:
Luego tenemos otro tipo de menú que es el JPopupMenu. Se usa igual que el JMenuBar pero se pone en un panel en donde podremos hacer click derecho y saldrá el menú desplegable con los elementos que hayamos hecho.

Para hacer la estructura del ejemplo he puesto los siguientes componentes todos dentro del JMenuBar:

Archivo (JMenu)
– Poner título (JMenuItem)
– Barra separadora (JSeparator)
– Un JCheckBoxMenuItem (JCheckBoxMenuItem)
– Un JRadioButtonMenuItem (JRadioButtonMenuItem)
– Otro JRadioButtonMenuItem (JRadioButtonMenuItem)
– Salir (JMenuItem)
Colores (JMenuItem)
– Blanco (JMenuItem)
– Negro (JMenuItem)
– Cambiar el color de fondo con otros colores (JMenu)
— Verde (JMenuItem)
— Rojo (JMenuItem)
— Azul (JMenuItem)
Minimizar (JMenuItem)

En el JPopupMenu que pone ¡Hola! ¡Feliz Navidad! simplemente hay dos JMenuItem. En medio de la ventana he puesto un JSeparator para mostrar que se puede poner no sólo como un elemento de menú. Y luego tenemos un JLabel con la frase explicatoria.

Sólo hay que ponerse a juguetear con el Swing Designer y seguro que bien rápido que se le coge el truco.

Queda añadir cómo hacer que haga algo al hacer click, ésto se llama ponerle un manejador de evento, en éste caso al evento click del ratón. De nuevo usando el Swing Designer, que para eso está, para hacernos la vida más fácil xD le damos en cualquier componente Swing con el botón derecho y nos sale un menú desplegable como el siguiente:

En la opción ‘Add event handler’ tenemos todos los eventos disponibles que podemos asociar con casi cualquier componente. El que nos interesa ahora es el mousePressed que significa apretar el ratón, que en la imagen de arriba ya sale programado, por eso pone -> line 110, porque está en la línea 110 del código fuente. Ésto lo hacemos para cada cosa que queramos que haga algo al hacer click y al darle a mousePressed nos dirigirá al código para que lo programemos, creando el esqueleto del programa asociado a dicho evento del ratón.

Los elementos JCheckBoxMenuItem y JRadioButtonMenuItem también tienen el evento del click de ratón, y podemos usar una propiedad llamada ‘selected’ para saber si estan seleccionados o no y hacer lo correspondiente en cada caso.

Aquí tienes el código del ejemplo:

// el paquete del programa
package principal;

// las librerias de java para hacer todo...
import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.Frame;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JCheckBoxMenuItem;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.JSeparator;
import javax.swing.border.EmptyBorder;

// la clase principal
public class Principal extends JFrame {

 // el panel que todo lo contiene
 private JPanel contentPane;

 // la entrada al programa, lo que primero
 // se ejecuta
 public static void main(String[] args) {
  EventQueue.invokeLater(new Runnable() {
   public void run() {
    try {
     // crea el frame en memoria
     // y lo visualiza
     Principal frame = new Principal();
     frame.setVisible(true);
    } catch (Exception e) {
     e.printStackTrace();
    }
   }
  });
 }

 // ésto es el constructor de la clase
 // aquí está todo
 public Principal() {

  // al cerrar la ventana sale del programa
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  // dimensiones y posición al arrancar del JFrame
  setBounds(100, 100, 450, 300);

  // la barra de menú
  JMenuBar menuBar = new JMenuBar();
  setJMenuBar(menuBar);

  // el menú Archivo empieza aquí ---------------------------------------
  JMenu mnArchivo = new JMenu("Archivo");
  menuBar.add(mnArchivo);

  JMenuItem mntmPonerTtulo = new JMenuItem("Poner tu00EDtulo");
  mntmPonerTtulo.addMouseListener(new MouseAdapter() {
   @Override
   public void mousePressed(MouseEvent e) {
    setTitle("Java Swing 5: Menús by jnj");
   }
  });
  mnArchivo.add(mntmPonerTtulo);

  JMenuItem mntmSalir_1 = new JMenuItem("Salir");
  mntmSalir_1.addMouseListener(new MouseAdapter() {
   @Override
   public void mousePressed(MouseEvent e) {
    dispose();
   }
  });

  JSeparator separator_1 = new JSeparator();
  mnArchivo.add(separator_1);

  JCheckBoxMenuItem chckbxmntmUnJcheckboxmenuitem = new JCheckBoxMenuItem(
    "Un JCheckBoxMenuItem");
  mnArchivo.add(chckbxmntmUnJcheckboxmenuitem);

  JRadioButtonMenuItem rdbtnmntmUnJradiobuttonmenuitem = new JRadioButtonMenuItem(
    "Un JRadioButtonMenuItem");
  mnArchivo.add(rdbtnmntmUnJradiobuttonmenuitem);

  JRadioButtonMenuItem rdbtnmntmOtroJradiobuttonmenuitem = new JRadioButtonMenuItem(
    "Otro JRadioButtonMenuItem");
  mnArchivo.add(rdbtnmntmOtroJradiobuttonmenuitem);
  mnArchivo.add(mntmSalir_1);

  // el menú Colores empieza aquí ---------------------------------------
  JMenu mnColores = new JMenu("Colores");
  menuBar.add(mnColores);

  JMenuItem mntmBlanco = new JMenuItem("Blanco");
  mntmBlanco.addMouseListener(new MouseAdapter() {
   @Override
   public void mousePressed(MouseEvent e) {
    contentPane.setBackground(Color.WHITE);
   }
  });
  mnColores.add(mntmBlanco);

  JMenuItem mntmNegro = new JMenuItem("Negro");
  mntmNegro.addMouseListener(new MouseAdapter() {
   @Override
   public void mousePressed(MouseEvent e) {
    contentPane.setBackground(Color.BLACK);
   }
  });
  mnColores.add(mntmNegro);

  JMenu mnCambiarElColor = new JMenu(
    "Cambiar el color de fondo con otros colores");
  mnColores.add(mnCambiarElColor);

  JMenuItem mntmVerde = new JMenuItem("Verde");
  mntmVerde.addMouseListener(new MouseAdapter() {
   @Override
   public void mousePressed(MouseEvent e) {
    contentPane.setBackground(Color.GREEN);
   }
  });
  mnCambiarElColor.add(mntmVerde);

  JMenuItem mntmRojo = new JMenuItem("Rojo");
  mntmRojo.addMouseListener(new MouseAdapter() {
   @Override
   public void mousePressed(MouseEvent e) {
    contentPane.setBackground(Color.RED);
   }
  });
  mnCambiarElColor.add(mntmRojo);

  JMenuItem mntmAzul = new JMenuItem("Azul");
  mntmAzul.addMouseListener(new MouseAdapter() {
   @Override
   public void mousePressed(MouseEvent e) {
    contentPane.setBackground(Color.BLUE);
   }
  });
  mnCambiarElColor.add(mntmAzul);

  // el elemento del menú para minimizar está aquí ---------------------------------------
  JMenuItem mntmNewMenuItem = new JMenuItem("Minimizar");
  menuBar.add(mntmNewMenuItem);
  mntmNewMenuItem.addMouseListener(new MouseAdapter() {
   @Override
   public void mousePressed(MouseEvent e) {
    setState(Frame.ICONIFIED);
   }
  });
  
  // aquí termina la barra de menú ...
  
  
  // el panel que todo lo contiene se crea
  contentPane = new JPanel();
  // se le pone un borde
  contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
  // se establece en el JFrame
  setContentPane(contentPane);

  // se hace JPopupMenu y lo pongo en el panel contenedor
  JPopupMenu popupMenu = new JPopupMenu();
  popupMenu.setBounds(0, 0, 319, 58);
  addPopup(contentPane, popupMenu);

  // el primer elemento del desplegable
  JMenuItem mntmhola = new JMenuItem("u00A1Hola!");
  popupMenu.add(mntmhola);

  // el segundo elemento del desplegable
  JMenuItem mntmfelizNavidad = new JMenuItem("u00A1Feliz Navidad!");
  popupMenu.add(mntmfelizNavidad);
  
  // el resto del JPanel con la raya separadora y la etiqueta explicatoria  
  contentPane.setLayout(null);

  JSeparator separator = new JSeparator();
  separator.setBounds(31, 88, 372, 24);
  contentPane.add(separator);

  JLabel lblHazClickCon = new JLabel(
    "Haz click con el botu00F3n derecho en la ventana para que salga el menu00FA.");
  lblHazClickCon.setBounds(10, 118, 414, 76);
  contentPane.add(lblHazClickCon);
 }

 // ésto es lo relativo al menú desplegable
 // lo que hace es mostrar éste menú donde sea que hagamos click 
 private static void addPopup(Component component, final JPopupMenu popup) {
  component.addMouseListener(new MouseAdapter() {
   public void mousePressed(MouseEvent e) {
    if (e.isPopupTrigger()) {
     showMenu(e);
    }
   }

   public void mouseReleased(MouseEvent e) {
    if (e.isPopupTrigger()) {
     showMenu(e);
    }
   }

   private void showMenu(MouseEvent e) {
    popup.show(e.getComponent(), e.getX(), e.getY());
   }
  });
 }
}

Y también como viene siendo costumbre el fichero con todo

Un saludo!


Java Swing 4: Pestañas

2012-12-14 - Categorías: Java / Java Swing

Para hacer un programa con pestañas repartiendo así los componentes se hace fácil con Swing y Eclipse. En pocos minutos, usando el generador de código esqueleto y con el Swing Designer te genera código.

Antes de poner el código, a saber, con el Swing Designer lo que tendremos será la ventana vacía, para poder posicionar los elementos tenemos que añadir en medio un Absolute layout. Luego dibujamos donde va a ir con el JTabbedPane. Después tenemos que añadir dos paneles encima del JTabbedPane, es decir, dos JPanel normales y corrientes. Las pestañas las creará el JTabbedPane cuando añadimos los paneles. Entonces ya tenemos las pestañas creadas, pero tenemos que decirle, en cada pestaña cómo vamos a posicionar los elementos y ponemos otros Absolute layout, uno en cada pestaña. Ahroa ya tenemos las pestañas y además podremos poner los elementos en la zona de la pestaña en que queramos, que en éste caso es una etiqueta JLabel en cada pestaña.
Aquí está el código:
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.border.EmptyBorder;

// Ésta es la clase principal
// es un JFrame...
public class Principal extends JFrame {

// el panel principal donde se pone todo
private JPanel contentPane;

// ejecuta primero todo ésto
public static void main(String[] args) {
// arranca en un hilo de ejecución...
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
// creando el frame y lo muestra
Principal frame = new Principal();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

// Constructor de la clase: se configura aquí toda
// la ventana y los controles...
public Principal() {

// título de la ventana
setTitle("Pestau00F1as con Swing by jnj");
// operación al cerra la ventana
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// coordenadas de las esquinas del frame en el escritorio
setBounds(100, 100, 419, 234);

// el panel que contiene todo se crea y se pone en el frame
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
// distribución nula para poder posicionar los elementos
// en las coordenadas que queramos
contentPane.setLayout(null);

// se crea el panel de pestañas
JTabbedPane panelDePestanas = new JTabbedPane(JTabbedPane.TOP);
// se posiciona en el panel
panelDePestanas.setBounds(10, 11, 383, 174);
contentPane.add(panelDePestanas);

// éste es el primer panel
// que se añade como pestaña al 'tabbedPane'
JPanel panel1 = new JPanel();
panelDePestanas.addTab("Panel 1", null, panel1, null);
// al panel le pongo distribución nula para
// posicionar los elementos en las coordenadas que
// quiera
panel1.setLayout(null);

// una etiqueta en el panel de la pestaña 1
JLabel lbl1 = new JLabel("Primera pestau00F1a..");
lbl1.setBounds(10, 11, 348, 14);
panel1.add(lbl1);

// otro panel de igual forma
JPanel panel2 = new JPanel();
panelDePestanas.addTab("Panel 2", null, panel2, null);
panel2.setLayout(null);

// otra etiqueta ésta vez en el segundo panel
JLabel lbl2 = new JLabel("Segunda pestau00F1a..");
lbl2.setBounds(10, 11, 290, 14);
panel2.add(lbl2);
}
}

Lo puedes descargar todo aquí: descargar. Hay un .jar ejecutable y el fuente .java

Un saludo!


Java Swing 3: Jugando con un JFrame, un JDialog y un JInternalPane

2012-12-13 - Categorías: Java / Java Swing
Ésto son un JFrame, un JDialog y un JInternalPane que van por un escritorio, y dice el JDialog al JFrame:
– ¡El usuario no me hace caso!
Interviene el JInternalFrame y le dice:
– Yo lo tengo chungo, ¡¡hazte modal pues!!
Qué chiste más friki xDD Bromas aparte.

En éste post voy a escribir sobre el manejo de las ventanas más básicas. Crear, abrir, cerrar, mostrar, esconder, cuádros de diálogo, ventanas internas o externas. Con el diseñador de ventanas (el Swing Designer), puedes ir construyendo tu propio ejemplo. Luego dejaré el ejemplo, códigos fuentes, con comentarios explicando los pasos.

Tres clases de ejemplo

Para el ejemplo he usado tres clases que he llamado:

  • EjemploJFrame
  • EjemploJDialog
  • EjemploJInternalFrame

Lo primero a hacer es tener la última versión de Eclipse y de Java, a ser posible. A fecha de hoy tengo la versión juno de Eclipse y de Java la 1.7 update 9. Y creo un nuevo proyecto llamado JavaSwing3JugandoConVentanas.

Gran parte del código lo ha generado Eclipse, así que me he ahorrado mucho tiempo. En el explorador de proyectos, con el botón derecho, en la carpeta donde van a ir los código, le he dado a New… -> Other…

Me ha salido una ventana como la de la imagen de arriba, he hecho las tres clases con los nombre que he puesto antes y ya tengo listo el esqueleto del programa. He puesto las clases en el paquete por defecto, es decir, sin poner el package donde quiero que esten, por eso en el código no se ve la línea package…

La idea de éste tutorial es intentar hacer un programa como el de la primera imagen del post, mirando lo menos posible los códigos fuentes de abajo.

Un JFrame es la ventana pricipal del programa, debe haber sólo uno. Éste tiene icono, y sale en la barra de tareas. Sin embargo el JDialog pertenece a un JFrame, debe tener un padre, no tiene icono ni sale en la barra de tareas. Por otro lado el JInternalFrame corre dentro de otro panel, en éste caso he puesto el caso más habitual, que corra dentro de un JDesktopPane. Se pueden abrir muchos diálogos y también muchas ventanas internas. Las ventanas modales, impiden que el usuario toque nada hasta que termine en ésa ventana y la cierre. En líneas generales ésto son las diferencias.

El código siguiente hace todo ésto, piensa que casi todo el código me lo ha generado Eclipse. He tratado de resumir el ejemplo lo más posible, comentandolo, aquí está el código:

EjemploJFrame

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

public class EjemploJFrame extends JFrame {

    private JPanel contentPane;

    // METODO PRINCIPAL QUE ARRANCA TODA LA APLICACIÓN
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    // crea el JFrame 
                    EjemploJFrame frame = new EjemploJFrame();
                    // lo hace visible
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    // EL CONSTRUCTOR QUE SE USA CUANDO ARRANCA AQUÍ ARRIBA
    public EjemploJFrame() {
        // el titulo de la ventana
        setTitle("Swing: Jugando con las ventanas by jnj");
        // acción al cerrar el frame: sale del programa
        // en éste caso, terminando la ejecución
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // posición de las esquinas del formulario en tu escritorio
        setBounds(100, 100, 450, 433);
        // el panel que contiene todo
        contentPane = new JPanel();
        // borde del panel
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        // se pone el panel en la ventana
        setContentPane(contentPane);
        // se establece disposición de las capas a null
        // para poder posicionar por coordenadas los componentes
        // ésto se hace con un Absolute Layout que se llama
        // en el diseñador visual
        contentPane.setLayout(null);

        // el botón que abre ventanas de diálogo
        JButton btnAbrirUnaVentana = new JButton(
                "Abrir una ventana de diu00E1logo con el usuario");
        btnAbrirUnaVentana.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                EjemploJDialog dialogo = new EjemploJDialog();
                dialogo.setVisible(true);
            }
        });
        btnAbrirUnaVentana.setBounds(10, 11, 414, 23);
        contentPane.add(btnAbrirUnaVentana);

        // el botón que abre ventanas de diálogo
        // pero de manera MODAL
        JButton btnAbrirUnaVentana_1 = new JButton(
                "Abrir una ventana de diu00E1logo MODAL");
        btnAbrirUnaVentana_1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                EjemploJDialog dialogo = new EjemploJDialog();
                dialogo.setModal(true);
                dialogo.setVisible(true);
            }
        });
        btnAbrirUnaVentana_1.setBounds(10, 70, 414, 23);
        contentPane.add(btnAbrirUnaVentana_1);

        JLabel lblSiLaAbrimos = new JLabel(
                "Si la abrimos modal, hasta no cerrarla no podemos tocar u00E9sta ventana.");
        lblSiLaAbrimos.setBounds(10, 45, 414, 14);
        contentPane.add(lblSiLaAbrimos);

        // el panel-escritorio donde veremos los JFrames internos 
        final JDesktopPane desktopPane = new JDesktopPane();
        desktopPane.setBounds(10, 138, 414, 246);
        contentPane.add(desktopPane);

        // botón para abrir las ventanas internas
        JButton btnAbrirUnJframe = new JButton(
                "Abrir un JFrame interno aquu00ED abajo");
        btnAbrirUnJframe.addActionListener(new ActionListener() {
            // variable para que cada nueva ventana interna
            // salga en diferente posición y se vean todas
            int posicioninicial = 0;

            public void actionPerformed(ActionEvent e) {
                EjemploJInternalFrame jif = new EjemploJInternalFrame();
                jif.setVisible(true);
                // posición de la nueva ventana
                jif.setLocation(posicioninicial, posicioninicial);
                // las siguiente posición será diferente así
                // veremos todas las ventanas internas
                posicioninicial += 10;
                desktopPane.add(jif);
            }
        });
        btnAbrirUnJframe.setBounds(10, 104, 414, 23);
        contentPane.add(btnAbrirUnJframe);
    }
}

EjemploJDialog

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.border.EmptyBorder;


// AQUÍ EMPIEZA LA CLASE
public class EjemploJDialog extends JDialog {

    private final JPanel contentPanel = new JPanel();

    /* ESTO LO GENERA ECLIPSE PARA PROBAR MIENTRAS CONSTRUIMOS
     * EL DIALOGO, LO PODEMOS DESCOMENTAR PARA
     * PROBAR EL DIÁLOGO SIN PROBAR TODA LA APLICACIÓN COMPLETA 
    public static void main(String[] args) {
        try {
            EjemploJDialog dialog = new EjemploJDialog();
            dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
            dialog.setVisible(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }*/

    // CONSTRUCTOR DE LA CLASE
    // crea la ventana, con los bordes, botones,
    // y todos los componentes internos para hacer lo que
    // se pretenda con éste diálogo.
    public EjemploJDialog() {
        // evita cambio de tamaño
        setResizable(false);
        // título del diáolog
        setTitle("u00C9sto es una ventana de diu00E1logo");
        // dimensiones que ocupa en la pantalla
        setBounds(100, 100, 450, 229);
        // capa que contendrá todo
        getContentPane().setLayout(new BorderLayout());
        // borde de la ventan
        contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
        // pone el panel centrado
        getContentPane().add(contentPanel, BorderLayout.CENTER);
        // sin capas para poder posicionar los elementos por coordenadas 
        contentPanel.setLayout(null);
        {
            // aquí se pone el JTextArea dentro de un JScrollPane 
            // para que tenga barras de desplazamiento
            JScrollPane scrollPane = new JScrollPane();
            scrollPane.setBounds(10, 11, 424, 146);
            contentPanel.add(scrollPane);
            {
                JTextArea txtrstoEsUn = new JTextArea();
                txtrstoEsUn.setText("u00C9sto es un JTextArea, aquu00ED podemos poner un texto de varias lu00EDneas.rn1rn2rn3rn..rnrnObserva que no se ve en la barra de tareas que exista u00E9sta ventana.  Si fuera un JFrame su00ED que se veru00EDa en la barra de tareas con el texto  del tu00EDtulo de la ventana...rnrnEl componente JTextArea estu00E1 dentro de un JScrollPane para que se  visualizen las barras de scroll cuando sea necesario.rnrnLa ventana tiene el atributo 'resizable' a 'false' para evitar que se pueda cambiar el tamau00F1o.rnrnrnrnrnrnFin del texto.");
                txtrstoEsUn.setLineWrap(true);
                txtrstoEsUn.setAutoscrolls(true);
                scrollPane.setViewportView(txtrstoEsUn);
            }
        }
        {
            // a continuación tenemos los botones clásicos 'Vale' y 'Cancela'
            // éste código lo ha generado Eclipse...
            JPanel buttonPane = new JPanel();
            buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
            getContentPane().add(buttonPane, BorderLayout.SOUTH);
            {
                JButton okButton = new JButton("Vale");
                okButton.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        // aquí van las acciones al hacer click en Vale
                        // envía el diálogo al recolector de basura de Java
                        dispose();
                    }
                });
                okButton.setActionCommand("Vale");
                buttonPane.add(okButton);
                getRootPane().setDefaultButton(okButton);
            }
            {
                JButton cancelButton = new JButton("Cancelar");
                cancelButton.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent arg0) {
                        // aquí van las acciones al hacer click en Vale
                        // envía el diálogo al recolector de basura de Java
                        dispose();
                    }
                });
                cancelButton.setActionCommand("Cancelar");
                buttonPane.add(cancelButton);
            }
        }
    }
}

EjemploJInternalFrame

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;

public class EjemploJInternalFrame extends JInternalFrame {

    /* ÉSTE MAIN LO GENERA ECLIPSE PARA PRUEBAS, LO DEJO 
     * COMENTADO PORQUE YA ESTÁ FUNCIONANDO Y SE EJECUTARÁ 
     * DENTRO DE UN JDesktopPane COMO TODO BUEN JInternalFrame
     * TAMBIÉN SE PUEDE EJECUTAR DENTRO DE OTROS PANELES
     * PERO ESO NO SE SUELE UTILIZAR.
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    EjemploJInternalFrame frame = new EjemploJInternalFrame();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }*/

    // ÉSTE ES EL CONSTRUCTOR DE LA CLASE
    public EjemploJInternalFrame() {
        // coordenadas con las dimensiones de la ventana
        setBounds(100, 100, 245, 134);
        // disposición de capas a nulo para poder posicionar
        // con coordenadas en vez de con el esquema determinado
        getContentPane().setLayout(null);
        
        // un etiqueta...
        JLabel lblstoEsUna = new JLabel("u00C9sto es una ventana interna...");
        lblstoEsUna.setBounds(10, 11, 333, 14);
        getContentPane().add(lblstoEsUna);
        
        // el botón que cierra ésta ventana interna
        JButton btnAprietaAquPara = new JButton("Aprieta aquu00ED para cerrar");
        btnAprietaAquPara.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                // ésto se ejecuta cuando se aprieta el botón
                // manda la clase a la basura,
                // con lo que se cierra la ventana
                dispose();
            }
        });
        btnAprietaAquPara.setBounds(10, 36, 209, 58);
        getContentPane().add(btnAprietaAquPara);

    }
}

Terminando

Puedes copiar éstos códigos cada uno en su fichero .java correspondiente: EjemploJFrame.java, EjemploJDialog.java y EjemploJInternalFrame.java. El fichero que arranca toda la aplicación es EjemploJFrame.java. Sólo necesitas el JRE para ejecutarlo.

Me volví un poco loco aprendiendo ésto, así que si te he aclarado las ideas, o has aprendido algo, estoy satisfecho.

¡Un saludo!


Java Swing 2: Crear ventanas con Eclipse

2012-12-08 - Categorías: Java / Java Swing

Para éste microtutorial he usado el Swing Designer de Eclipse y la versión 1.7 update 9 de Java, el JDK y el JRE.

En Eclipse tenemos tenemos varias opciones para generar código esqueleto para nuestro programa. En la ventana del explorador de proyectos, en el lugar elegido le damos con el botón derecho a New -> Other… y nos saldrá una ventana como la siguiente con las opciones disponibles con respecto a Swing:

En el árbol de Swing Designer tenemos las opciones para crear programas con ventanas Swing, valga la redundancia. Todos los códigos generados con el Swing Designer también se pueden crear a mano y se pueden llevar a otros entornos de desarrollo y te van a funcionar. Ésto lo digo porque no ocurre siempre, según en qué entorno de desarrollo estés, a veces pasa que si te sales de él ya no te sirven los códigos porque se les han puesto “extras” que te atan a ellos. Ésto no te va a pasar con los Swing en Eclipse, o por lo menos yo no me encontrado con éste problema.

Vamos al grano…

Application Window

Si elegimos una Application Window nos va a crear la clase siguiente:

package pruebasSwing;

import java.awt.EventQueue;
import javax.swing.JFrame;

public class ApplicationWindowPrueba {

    private JFrame frame;

    // primero se ejecuta ésto…
    public static void main(String[] args) {
        // en un hilo de ejecución aparte hace todo
        // porque todo lo hace en un new Runnable
        // a continuación…
        EventQueue.invokeLater(new Runnable() {
            // run es el método que se ejecuta
            // al arrancar el hilo
            public void run() {
                try {
                    // crea una variable de la clase y se inicializa
                    // con el constructor de la misma                  
                    ApplicationWindowPrueba window = new ApplicationWindowPrueba();
                    // muestra la ventana
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    // éste es el constructor de la clase
    public ApplicationWindowPrueba() {
        initialize();
    }

    // la función que inicializa
    private void initialize() {
        // crea el frame
        frame = new JFrame();
        // coordenadas de la ventana
        frame.setBounds(100, 100, 450, 300);
        // establece la operación a ejecutar cuando
        // se cierra el JFrame
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

}

Se trata de una clase que no hereda de ninguna otra, y lo que simplemente hace es crear un JFrame en un hilo de ejecución separado.

JApplet

Un Applet es una programa de Java que se ejecuta en un navegador de Internet. Éste programa se le envía al cliente mientras que navega y se ejecuta en su máquina. Nos crea lo básico para hacer uno, pero a fecha de hoy están totalmente en desuso y los navegadores los desactivan por defecto.. Así que mejor ni probarlo…

package pruebasSwing;

import javax.swing.JApplet;

// clase que extiende de JApplet,
// que a su vez extiende de la clase
// Applet y ésta en sí es un Panel…
public class JAppletPrueba extends JApplet {

    // el constructor
    public JAppletPrueba() {

    }
}

JDialog

Con ésta opción generaremos el código para hacer un típico cuadro de diálogo con el usuario para que se le informe de algo o elija entre las opciones que queramos. Éste tipo de ventanas se usan asociadas a otra ventana padre, aunque al tener un main se puede generar un .jar ejecutable que sólo tenga un cuadro de diálogo de éstos.

El código que genera:

package pruebasSwing;

import java.awt.BorderLayout;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

// la clase que extiende de JDialog,
// que a su vez extiende de Dialog,
// y ésta de Window…
public class JDialogPrueba extends JDialog {

    private final JPanel contentPanel = new JPanel();

    public static void main(String[] args) {
        try {
            // crea un nuevo objeto de la clase
            JDialogPrueba dialog = new JDialogPrueba();
            // operacion al cerrar
            dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
            // lo muestra
            dialog.setVisible(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // constructor de la clase
    public JDialogPrueba() {
        // propiedades de la ventana
        setBounds(100, 100, 450, 300);
        getContentPane().setLayout(new BorderLayout());
        contentPanel.setLayout(new FlowLayout());
        contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
        getContentPane().add(contentPanel, BorderLayout.CENTER);
       
        // los botones para confirmar o cancelar
        {
            JPanel buttonPane = new JPanel();
            buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
            getContentPane().add(buttonPane, BorderLayout.SOUTH);
            {
                JButton okButton = new JButton(“OK”);
                okButton.setActionCommand(“OK”);
                buttonPane.add(okButton);
                getRootPane().setDefaultButton(okButton);
            }
            {
                JButton cancelButton = new JButton(“Cancel”);
                cancelButton.setActionCommand(“Cancel”);
                buttonPane.add(cancelButton);
            }
        }
    }

}

JFrame

Con el asistente del JFrame, hace casi lo mismo que con el de Application Window, pero hay dos ligeras diferencias. La primera es que con Application Window tenemos una variable interna a la clase que es el JFrame, y con el éste lo que tenemos es que la clase misma extiende a JFrame, con lo que realmente tenemos un JFrame en sí que se puede reutilizar en otros lugares del programa. La segunda diferencia es que añade un JPanel al JFrame, cosa que con el asistente de Application Window no lo hace.

El código es el siguiente:

package pruebasSwing;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

// la clase extiende de JFrame, realmente ES un JFrame
public class JFramePrueba extends JFrame {

    private JPanel contentPane;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    JFramePrueba frame = new JFramePrueba();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public JFramePrueba() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        // añade el panel…
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);
    }

}

JInternalFrame

Ésta clase se usa para hacer ventanas que se ejecutan dentro de un JDesktopPane. Es decir, dentro de la misma ventana padre, tendremos una zona que será un panel de escritorio, el anterior JDesktopPane. Y en éste panel es donde veremos el JInternalFrame. Así que necesitaremos un JFrame padre para poder ejecutarlo dentro.

Ésta clase tiene un main pero no se puede ejecutar en un .jar aparte.

El código:

package pruebasSwing;

import java.awt.EventQueue;
import javax.swing.JInternalFrame;

public class JInternalFramePrueba extends JInternalFrame {

    // arranca en un hilo el formulario hijo
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    JInternalFrame frame = new JInternalFrame();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    // aquí estará construida la ventana
    public JInternalFramePrueba() {
        setBounds(100, 100, 450, 300);

    }

}

JPanel

Ésto es una clase básica que podemos usar en otros formularios o ventanas. Es decir, podemos poner paneles dentro de JFrames. Así que puede ser útil tener un panel programado aparte. El código que genera es:

package pruebasSwing;

import javax.swing.JPanel;

public class JPanelPrueba extends JPanel {

    // constructor de la clase
    public JPanelPrueba() {

    }

}

Swing Automatic Databinding

Aquí tenemos un asistente que nos va a crear lo necesario para crear una ventana con Databindings. Necesitaremos un Bean, y configurar las diversas opciones. Ésto es bastante extenso así que ya tengo tema para otro post.. 🙂

Terminando

Las principales clases que primero se van a usar van a ser la ApplicationWindow o la JFrame. De éstas la JFrame es bueno usarla de un principio porque luego la puede incluir dentro de otros proyectos sin muchos cambios.

Dentro de Eclipse podemos visualizar todos los anteriores con F11, menos el JInternalFrame y el JPanel que se podrá visualizar dentro de otro. Una vez generado el código correspondiente, podremos entrar a editar el diseño visualmente, con lo que nos ahorraremos un considerable esfuerzo.

Con ésto me voy a la cama y mañana más…

Un saludo!


Java Swing 1: A vista de pájaro

2012-12-05 - Categorías: Java / Java Swing
En éste post, espero dar un vistazo general al paquete de clases de Java de Swing, en concreto a la versión estándar 1.7 update 9. En la fecha en que escribo ésto, los Swing ya no están en desarrollo, con lo que no se van a añadir nuevas funcionalidades, ni componentes. En la web de Oracle, podemos ver la jerarquía completa del paquete javax.swing en la documentación original, aquí teneis el árbol de la jerarquía de clases:

Casi todas las clases que hay para crear nuestra interfaz de usuario van a empezar por J, como JFrame, JDialog, JButton, JLabel, etcétera… Ya tengo instalada la versión del JDK y del JRE más nueva ahora mismo para asegurarme de que tengo al día el paquete de clases. Así pues, la ayuda contextual de Eclipse me muestra un listado de todos éstos componentes:
Tenemos 46 clases en éste listado, de las cuales la clase con la que se contruyen todas las demás clases visuales es JComponent. El resto de clases de Swing que no comienzan por J, ayudan o nos sirven de herramientas para éstas. Quitando la JComponent, nos quedan 45 clases que “dibujan” nuestra interfaz gráfica.

Estado actual

Swing se contruyó a partir de AWT, es decir se basa en AWT, que es más dependiente del Sistema Operativo. De ésta forma los programas hechos con Swing son más independientes del Sistema Operativo, así que mejor si usamos Swing porque está más elaborado. Otro tema es JavaFX, que es el siguiente “level” en la programación gráfica que la gente de Java están desarrollando. JavaFX promete ser más independiente del Sistema Operativo si aún cabe, prometiendo en un futuro que tu programa desarrollado en JavaFX llegue a ser compatible con cualquier dispositivo que tenga gráficos, como móviles, televisiones, coches, incluso en una página web dicen en los vídeos de Oracle siempre que tengamos la máquina virtual de Java instalada. Pero todo ésto se va del tema del post que tenemos entre manos…

Contenedores externos

Volviendo a los Swing, de todas éstas clases tenemos las clases que nos van a ayudar a estructurar nuestro programa en ventanas, diálogos, paneles.. en donde vamos a poner el resto de componentes. Éstas clases son las siguientes:
  1. JFrame -> es la madre del cordero, la clase que normalmente se usa para que contenga el resto de componentes, es la principal.
  2. JApplet -> para construir un applet.
  3. JDesktopPane -> crea una zona donde podemos poner ventanas internas (JInternalFrame).
  4. JDialog -> es una ventana de diálogo.
  5. JInternalFrame -> ventana hija que debe estar dentro de un escritorio (JDesktopPane).
  6. JLayer -> crea un borde alrededor de otro componente.
  7. JLayeredPane -> es un panel con borde.
  8. JPanel -> un panel simple sin adornos ni nada.
  9. JRootPane -> panel principal que puede contener otros objetos.
  10. JScrollPane -> es un panel que sirve para contener objetos que se salen del campo, entonces con barras de scroll podemos movernos por ellos.
  11. JSplitPane -> sirve para dividir una zona en dos, en cada subdivisión podemos poner otros elementos.
  12. JTabbedPane -> parecido al JSplitPane pero divide las zonas en pestañas.
  13. JViewPort -> es un objeto que sirve para visualizar los otros objetos que se mueven en una ventana, como por ejemplo con barras de scroll.
  14. JWindow -> es como un JFrame pero sin bordes ni botones para cerrar, maximizar y minimizar.
Pueden crearso objetos anteriores y meterse unos dentro de otros, algunos se pueden omitir y otros son necesarios. Por ejemplo si queremos ventanas internas debemos de ponerlas dentro de un panel de escritorio (JDesktopPane), sino no funcionará.

El resto de componentes

Vistos los anterioes 14 elementos, nos quedan 45 menos 14 que son 31 componentes. Éstos que quedan son más conocidos y en cuanto leemos sobre ellos seguro que sabemos de qué hablamos.
Los clásicos:
  1. JButton -> para hacer botones.
  2. JCheckBox -> cajas chequeables.
  3. JComboBox -> pues el combo de siempre, creo que se llama “caja de selección desplegable”.
  4. JLabel -> para poner etiquetas.
  5. JList -> implementa una lista seleccionable.
  6. JOptionPane -> panel donde podemos poner opciones a elegir.
  7. JPasswordField -> campo de contraseña.
  8. JProgressBar -> barras de progreso.
  9. JRadioButton -> estos son los elementos que dan varias opciones a elegir, en la que sólo una es posible.
  10. JEditorPane -> para poner textos complejos, admite HTML y  texto en el formato Rich Text Format (RTF).
  11. JFormattedTextField -> para poner textos con formato.
  12. JTextArea -> areas de texto donde podemos poner textos grandes, multilínea.
  13. JTextField -> areas de textos pequeños, de una sola linea de texto.
  14. JTextPane -> admite textos formateados, iconos y componentes.
Unas utilidades:
  1. JColorChooser -> nos sirve para mostrar una ventana donde podemos elegir un color.
  2. JFileChooser -> éste objeto es una ventana para elegir un archivo.
Menús:
  1. JMenu -> ésto es un menú que podemos poner dentro de una barra de menú o dentro de otro menú.
  2. JMenuBar -> barra de menús, dentro de ésta se ponen el resto de los elementos de los menús.
  3. JMenuItem -> es un elemento de menú.
  4. JCheckBoxMenuItem -> cajas de texto seleccionable en un menú.
  5. JPopupMenu -> implementa un menú desplegable.
  6. JRadioButtonMenuItem -> para poner opciones a elegir en un menú.
  7. JSeparator -> es una raya entre elemento y elemento de menú.
Otros:
  1. JToolBar -> es una barra de herramientas para personalizar.
  2. JToolTip -> muestra un texto al pasar por encima de un componente.
  3. JScrollBar -> barras de scroll.
  4. JSlider -> es una barra que puedes mover arriba y abajo con la que elijes un valor.
  5. JSpinner -> es una caja de texto con dos botones arriba y abajo para cambiar el valor de la caja.
  6. JToggleButton -> botón con dos estados, presionado y no presionado.
  7. JTable -> se usa para mostrar tablas de datos, como su nombre indica.
  8. JTree -> es un árbol, que puede servir para mostrar por ejemplo un árbol de directorios.
Con ésto ya nos podemos hacer una idea de las posibilidades que tenemos para hacer una interfaz de usuario con Swing.
Espero que sirva de ayuda.
Un saludo.

Multiprocesamiento en Java: ¡Dale caña a tu procesador!

2012-11-17 - Categorías: General / Java

Multiprocesamiento, como reza la Wikipedia, se refiere a la ejecución de varios procesos de manera concurrente, es decir, a la vez. Con los nuevos procesadores que cada vez nos traen más núcleos, he visto que ésto viene a ser más importante. Con Java el multiprocesamiento para aprovechar los núcleos de uno o varios procesadores viene gestionado con la máquina virtual de Java. Es decir, sólo tendremos que preocuparnos de hacer el programa de manera que se puedan ejecutar ‘a trozos’, poner cada tarea en un hilo de ejecución y luego la máquina virtual se encargará de gestionarlo todo.

Ésto es lo mismo que viene ocurriendo con los Sistemas Operativos (SO). Tenemos muchos procesos que se ejecutan desde que arrancamos el ordenador, y el SO se encarga de gestionar qué se ejecuta en cada momento. De igual manera nosotros en Java podemos gestionar qué se ejecuta o que se queda esperando, también podemos decirle a todas las tareas que se ejecuten a la vez simplemente sin esperar unas a otras ni nada parecido. Ésto es lo que vamos a ver con el ejemplo sencillo de a continuación, donde se van a crear dos tareas, a y b, y se van a ejecutar concurrentemente.

Continuar leyendo..

Hola Mundo con Swing y Eclipse

2012-11-10 - Categorías: Java / Java Swing
Aquí dejo cómo crear una primera aplicación gráfica en Java usando Swing y Eclipse. El ejercicio clásico ¡Hola Mundo! usando una tecnología que nos brinda Java crear aplicaciones con entorno gráfico, Java Swing. Y para verlo, el entorno de desarrollo elegido ha sido Eclipse.

Curioseando qué tal van los desarrollos, con respecto a las interfaces gráficas de usuario (llamadas GUI para los amigos), veo que tengo otra nueva actualización del Window Builder. El Window Builder es un conjunto de plugins de Eclipse que nos van a permitir hacer GUIs en Java sin gastar casi tiempo.

A fecha de hoy tengo la versión Juno de Eclipse, y me acabo de instalar el plugin Swing Designer que está disponible dentro del propio Eclipse, en la famosa opción Help -> Install New Software. Instalada la versión 1.5.1 del Swing Designer, me he puesto manos a la obra.

En el Explorador de Proyectos, donde estés creando tu aplicación Java, le das con el botón derecho del ratón a New -> Other… Y verás una ventana como la siguiente donde puedes elegir todo el tipo de ficheros, clases, o lo que sea que quieras hacer:
Se parece a Visual Studio, NetBeans o IDEs similares ¿verdad? Personalmente no creo que Eclipse tenga nada que envidiar a ningún otro entorno de desarrollo de pago, o no de pago. ¿Qué más queremos teniendo Eclipse? Parezco un vendedor de Eclipse (jejejje es broma). Bromas aparte, depende de dónde te encuentres te irá mejor un entorno de desarrollo u otro…
Seguimos con lo que tenemos entre manos. He creado mi nueva Application Window que he llamado HolaMundoSwing y se me abre una ventana dentro de Eclipse tal que así:
Me ha generado 44 líneas de código, con las que ya tengo mi ventana con el programa básico. Tenemos disponible absolutamente todo el código necesario para crear aplicaciones con GUIs, es decir, que no se nos esconde nada del código fuente. Podríamos usar éste mismo código fuente en línea de comandos, y compilar nuestro programa Java con el javac.exe sin usar Eclipse. Lo que quiero explicar, es que Eclipse te genera y te da todo el código fuente, sin crear archivos secundarios en tu proyecto donde gestione la parte gráfica. No te atas a Eclipse. Es decir, en éste caso todo lo necesario está dentro del mismo fichero, te puedes llevar ésta recién creada aplicación de ventanas a otro sitio con sólo llevarte el fichero HolaMundoSwing.java y seguir programando.
Vamos ahora a lo que más nos va a interesar, el diseñador de formularios que nos va a ahorrar mucho tiempo en el diseño de la interfaz de usuario. Abajo tenemos una pestaña que pone ‘Design’, diseño en castellano. Le damos y nos sale una ventana como la siguiente. Aquí es donde podemos editar visualmente todo tipo de componentes visuales del estilo de botones, cajas de texto, grupos de selección, podemos poner imágenes, menús, y un largo etcétera…
Cómo se usa cada componente merece un post, así que éste lo voy a dejar así.

Lo lógico es que quieras juguetear poniendo componentes en tu nueva ventana. Para poder posicionarlos donde quieras hay que poner antes de nada en el formulario un ‘Absolute layer’ que tenemos en la sección ‘Layouts’. Después ya podrás poner los componentes donde quieras. En pocos segundos he puesto un botón, una etiqueta y una caja de selección, como podemos ver en la imagen de aquí arriba. Si volvemos a la pestaña de abajo donde pone ‘Source’, en nuestro Eclipse, veremos que automáticamente se ha generado todo el código correspondiente para dibujar los componentes en nuestro GUI. Queda después añadir el código para hacer funcionar cada cosa.

Puedes hacer doble click en el botón para ver la facilidad con que puedes empezar a programar. Se te pondrá delante el código fuente y la función donde puedes programar el click del botón. Verás un código tal que así:

JButton btnNewButton = new JButton(“Botu00F3n”);
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// AL HACER CLICK EJECUTA ÉSTO
}
});
btnNewButton.setBounds(10, 11, 89, 23);
frmholaMundoSwing.getContentPane().add(btnNewButton);

Aquí queda ésta pequeña introducción a los Swings de Java. Si quieres hacer un fichero ejecutable de Java, un .JAR y distribuir el programa que acabas de hacer; en la ventana del explorador de proyectos, le das con el botón derecho del ratón al fichero HolaMundoSwing.java. Se despliega el menú y le haces click en Exportar. Luego eliges Java JAR file. Eliges destino. Y ya tienes un ejecutable .jar que puedes usar en cualquier ordenador con el JRE instalado.
Un saludo.

Java Básico 5: Clases comunes

2012-10-07 - Categorías: Java

¡Hola de nuevo! Estoy cogiendo carrerilla con ésto de los tutoriales, me siento fresco, será el buen tiempo, que es fin de semana, los pájaros cantan, el indice Ibex sube, la prima de riesgo baja aquí en España. La cosa no está para echar cohetes pero bueno, si necesitas hacer cosas en Java, que ya están hechas, sólo tendrás que usarlas y entonces sí que vas a hechar cohetes. Vamos a ver unas clases de Java que nos facilitan la vida mucho, sobre todo si estas siguiendo el tutorial desde cero.

Para empezar, si vamos a utilizar cadenas de caracteres, Java nos proporciona la clase String. Podemos declarar variables de tipo String de la forma:

String cadena;
cadena = “Aquí va la cadena de caracteres que queramos”;
cadena = cadena + cadena;
System.out.println(cadena);

Ésto anterior nos va a imprimir:

Aquí va la cadena de caracteres que queramosAquí va la cadena de caracteres que queramos

Lo que hemos visto aquí arriba es que la variable cadena le hemos dicho que almacene “Aquí va la cadena de caracteres que queramos”, luego al hacer la suma lo que le hemos dicho que haga es que ahora cadena vale cadena + cadena, es decir, pon dos veces el valor de cadena.

Ahora vamos a leer una cadena desde el teclado, usando las clases BufferedReader, IOException e InputStreamReader:

package javaBasico;

import java.io.BufferedReader;

import java.io.IOException;
import java.io.InputStreamReader;

public class JavaBasico5ClasesComunes {

public static void main(String[] args) throws IOException {

String cadena;

// ésto es un lector de buffer
BufferedReader br = new BufferedReader(new
    InputStreamReader(System.in));
// daclarado de forma que br apunta al System.in
// el System.in es la entrada del sistema, 
// que es el teclado

System.out.print(“Escribe una cadena y pulsa
 enter: “);
cadena = br.readLine();
// con el readLine lo que hace el programa es 
// esperar a que
// escribas algo y aprietes enter, y lo 
// guarda en la variable
// cadena

System.out.println(“Has escrito: ” + cadena);

}

}

El código fuente anterior habla por sí sólo, es la manera de leer una cadena desde el teclado, aunque es un poco confuso si eres nuevo en Java pero no te preocupes. Tenemos formas más fáciles de leer datos desde el teclado. Las clases System.in, System.out, y System.err son muy comunes. Por ejemplo el siguiente programa lee valores desde el teclado:

package javaBasico;

import java.io.IOException;

public class JavaBasico5ClasesComunes {


public static void main(String[] args) throws IOException {

char b;

System.out.println(“Escribe una letra y pulsa enter: “);
b = (char) System.in.read();
System.out.println(b);

}

}

Queda saber que el System.err es la salida del sistema para los errores. Normalmente lo que escribamos en el System.err se muestra en la pantalla. Es útil usar la salida de errores porque de ésta manera, más adelante podremos diferenciar entre lo que hemos escrito como error y lo hemos escrito en el out normal. Se supone que los errores a lo mejor queremos guardarlos en un fichero y sólo queremos que se vea en la pantalla lo que escribimos en el out. Un ejemplo de uso de out y del err, aunque ya hemos usado el out varias veces, es muy parecido:

System.out.println(“Ésto es salida normal, para el out”);
System.err.println(“Ésto es un error, para el err”);

Más adelante podremos decirle al programa que haga algo concreto con lo que se escribe en la salida o en error, es lo que se llama redireccionar las salidas estándar o de errores.

No me voy a extender demasiado en éste post, así que como última clase de uso común de Java vamos a ver la clase Math. Si algo que tiene Java, es que es muy muy grande, y seguro que hay algo para lo que quieras. Me remito a la documentación de Java oficial a fecha de hoy:

http://docs.oracle.com/javase/6/docs/api/

… por si deseas entrar más en detalle sobre las clases disponibles.

Podemos observar lo rico que es Java en utilidades que tenemos disponibles, mire la siguiente imagen de mi Eclipse funcionando, programando para éste minitutorial con la clase Math, al escribir el punto se me despliega lo siguiente:

Puedes ver la cantidad de funciones matemáticas que tienes disponibles, ahora es cuando tienes que hechar cohetes 🙂 no tienes que reinventar la rueda volviendo a programar cosas que ya tengas hechas. Recomiendo que antes de sentarse a programar funciones nuevas mire a ver si ya lo tenemos disponible listo para usarlo.

Un ejemplo sencillo de uso de la clase Math es:

package javaBasico;

public class JavaBasico5ClasesComunes {

public static void main(String[] args) {

System.out.println(Math.abs(-23));

}

}

Su resultado va a ser que va a escribir en la pantalla 23, que es el valor absoluto de -23.

Bueno con esto ya tienen para hacer unas pruebas o para seguir investigando por otro lado. Hay gran cantidad de funciones dentro de la clase Math: para hacer raices cuadradas, senos, cosenos, tangentes, logaritmos, máximos, mínimos, redondear… y también una gran cantidad de clases de uso común.

Si hay algo que no exista y necesites, puedes hacer tu propia clase de utilidades con las funciones quieras.
Ya lo veremos a lo mejor en otro tutorial.

Un saludo


Java Básico 0: Aterrizando

2012-09-28 - Categorías: Java

Daremos comienzo con éste post a una serie sobre programación para todos aquellos que siempre hemos querido aprender Java pero nos ha costado bastante. No será por la falta de información disponible sino todo lo contrario. Las posibilidades de Java para programar ordenadores, dispositivos móviles, tablets, coches, lavadoras y un largo etcétera… hacen, o por lo menos a mi, me han hecho aprender Java bastante engorroso. No recomiendo empezar con Java como primer lenguaje de programación, pero si lo prefieres tampoco es una mala opción porque tiene mucha salida, es muy completo, tiene de todo y sirve para todo.

Prácticamente se puede hacer de todo en Java aunque a veces no sea lo mejor. Depende de la aplicación que vayamos a desarrollar, la funcionalidad, tiempo disponible, recursos de hardware que tenemos, su tipo, si tenemos un pedazo de ordenador multinúcleo o necesitamos aprovechar al máximo el pequeño núcleo de un pequeño dispositivo, sería mejor un lenguaje u otro, pero ese es otro tema.

Para todo ello tenemos muchas herramientas disponibles, gratuitamente o de pago, a mi me gustan las gratuitas claro: Eclipse, NetBeans, Notepad++… que nos van a hacer la vida más fácil. Algunos programas tienen generadores de código, para crear nuevas clases, servlets, formularios, con diseñadores de formularios. Según yo he visto a fecha de hoy, los dos entornos de desarrollo, también llamados IDE de desarrollo, más utilizados para programar en Java vienen a ser Eclipse y NetBeans. Con el que estoy más familiarizado es Eclipse, así que va a ser Eclipse el que voy a utilizar, o casi siempre utilizaré.

Java es un lenguaje que nos proporciona unas cosas que lo hacen muy atractivo para aprender a programar. Algunas de ellas son:

  • Es independiente de la plataforma: o en la mayoría de los casos, nuestros programas hechos en Java podemos desarrollarlos de manera que se puedan ejecutar en todo tipo de Sistemas Operativos. Lo único necesario para poder ejecutarlos es tener la Máquina Virtual de Java, también llamada JRE para los amigos (Java Runtime Environment).
  • Es un lenguaje de programación muy utilizado, con lo que casi seguro que encontraremos ejemplos para todo tipo de problemas, ya que tarde o temprano repetimos el mismo problema unos programadores y otros y alguien publica la solución en algún foro o blog.
  • Grandes empresas estan implicadas, Sun Microsystems, Oracle, Microsoft es un gran competidor con Java con su C# que sorprendentemente se parece mucho… Las empresas de telefonía, todo tipo de industrias, bancos, etc…
  • Se puede hacer de todo: aplicaciones de escritorio, de servidor, para móviles, tablets.. el archiconocido Android tiene un entorno de desarrollo en el que usamos Java. Los móviles con su J2ME para poder hacer también programas para móviles. Se pueden hacer páginas web. También juegos, sobre todo ahora que los procesadores han mejorado tanto, ya que antes era un problema porque tener una interfaz con el Sistema Operativo, la Máquina Virtual de Java, hacia un poco más lentos los programas. Pero ahora eso no tiene casi importancia, o cada vez menos. Si necesitamos interconexión con Sistemas de Información antiguos seguro que en Java encontraremos la forma de interconectar. Etcétera…
Vamos, que tiene de todo! Ya me siento vendedor de Java.
Antes de empezar a instalar nada en nuestra máquina debemos tener claras unas cosas. Para éste curso rápido de aprendizaje en Java vamos a centrarnos en aprender las bases, en concreto, en aprender o practicar la sintaxis, variables, tipos de datos, bucles, etc… y a ver si podemos llegar a temas más avanzados como clases, objetos, herencia, polimorfismo y otras especies de otros mundos… Necesitaremos el JDK de Java, Eclipse y paciencia. Tenemos disponibles éstos dos aquí a continuación, la paciencia la tendrás que poner tú:
Si has seguido el tutorial o guía espero que con ésto ya tengas instalado Eclipse. Que estés probando o hayas conseguido ya hacer el ‘Hola Mundo’ clásico. Y no hayas tenido un aterrizaje forzoso.
Saludos

Aprender a programar con Eclipse

2012-09-20 - Categorías: General

Parece que va a llover pero luego no llueve, los impuestos suben, el trabajo baja… Todo se complica un poco más aquí en Alicante pero hoy vamos a verlo todo un poco menos complicado, por lo menos para los que quieran comenzar a utilizar éste brillante programa llamado Eclipse. Con el que podremos hacer todo tipo de programas, desde sencillos “hola mundo” en C, HTML, Java… a complicados y enormes programas, colaborando con equipos de desarrollo distribuidos por el mundo usando SVN o GIT.

Para empezar debemos acudir a http://www.eclipse.org/ donde tenemos la página principal del programa con todo tipo de información. Está en inglés, a fecha de hoy no encuentro una versión en castellano, así que seguiremos en inglés. Vamos a la sección de Downloads y podemos ver la gran cantidad de lenguajes de desarrollo que soporta.

Técnicamente Eclipse es un entorno de desarrollo, un IDE de desarrollo de todo tipo de aplicaciones. Está casi por completo desarrollado en Java. Con más de 2 millones de líneas de código fuente a fecha de hoy. Se trata de un programa publicado inicialmente con licencia CPL, posteriormente re-licenciado bajo la Eclipse Public License, como reza en Wikipedia, resumiendo que un software gratuito que podemos usar para nuestros proyectos personales o de negocio sin coste alguno. También hay todo tipo de plugins con los que le añadimos funcionalidad.

A mi me gusta la primera versión, Eclipse IDE for Java EE Developers, es la que conozco más y de las que he probado es la que me ha solucionado los problemas lo más rápido posible. También le he instalado los plugins para desarrollos en PHP, diseño de formularios con Java y alguna otra cosa pero eso es otro tema.

Necesitamos para su buen funcionamiento la JDK de Java instalada en nuestro sistema.

Hay que destacar que Eclipse está disponible en Windows, Mac o Linux, principales sistemas operativos que más veo. Con lo que no estamos atados a utilizar tal o cual sistema operativo.

Una vez que hemos bajado nuestra copia de Eclipse nos damos cuenta de que no tiene instalador, así es, no se instala sino que se descomprime en la carpeta que nosotros prefiramos. Yo lo tengo descomprimido en la carpeta donde tengo mis archivos así que cuando hago una copia de seguridad de mis datos también se me copia el Eclipse y toda su configuración. De ésta manera en caso de catástrofe, y siempre que no haya entrado en la catástrofe la copia de seguridad, tendré mi Eclipse listo para usar de nuevo con un simple copy-paste de la carpeta.

La primera vez que arranquemos nuestro nuevo y flamante Eclipse nos va a preguntar sobre nuestro directorio de trabajo, que va a ser el directorio donde se guardarán nuestros proyectos. Recomiendo también ponerlo en el mismo directorio donde tienes tus datos, así también se copiarán tus proyectos con la copia regular de tus datos. Todo ésto claro suponiendo que estas haciendo copias de seguridad xDD De todas maneras siempre podrás cambiar el Workspace más adelante.

Para empezar a utlizar Eclipse hay que comprender su funcionamiento principal. Tenemos que ir al Workbench, para ello en algunas versiones o según el estado del tuyo tendremos tal vez un botón con una flecha donde pone ‘Go to Workbench’.

Tenemos una serie de proyectos con unos archivos y unos directorios alojados en el disco duro. Éstos proyectos pueden ser de varios tipos: Java, página web con PHP, C/C++, etc.. Entonces dentro de Eclipse tenemos varias perspectivas que podemos nosotros diseñar. En cada perspectiva nosotros podemos configurar, por ejemplo para Java, que nuestro Eclipse nos muestre el explorador de proyectos a la izquierda, los archivos abiertos en medio, las salidas de programa abajo, y así sucesivamente…

Para terminar con el tutorial vamos a hacer un nuevo proyecto “HolaMundoJava” que mostrará el mítico mensaje. Le hacemos click derecho en explorador de proyectos, le damos a nuevo, y nos saldrá una ventana con tooooodos los tipos de proyectos disponibles. Elegimos pues “Java Project”, le ponemos de nombre “HolaMundoJava”, le damos a siguiente, siguiente, next, finish, siguiente y así sucesivamente hasta que se nos cierre la ventana y en el explorador de proyectos nos aparezca el nuevo proyecto y quede el Eclipse parecido a la imagen de arriba. No voy a ponerlo todo masticado así nos familiarizamos con el programa creando proyectos…

Ahora vamos a hacer nuestro primer programa rápidamente, en el proyecto que acabamos de crear, click derecho y le damos a New -> Class entonces nos sale la ventana para hacer ficheros Java, seleccionamos donde pone “public static void main…” le damos nombre y nos generará la nueva clase Java de ejemplo. Yo he hecho el siguiente programilla:

public class hola {
  public static void main(String[] args) {
    System.out.println(“Hola mundo”);
  }
}

Ahora le damos a F11 y si todo ha ido bien por la ventana de consola tiene que salir: Hola mundo

Tienes una cantidad enorme de opciones, plugins, generadores de código, diseñadores de formularios, es abrumador las posibilidades de que disponemos con éste programa.

Por hoy me despido.
Saludos

© 2021 JnjSite.com - MIT license

Sitio hecho con WordPress, diseño y programación del tema por Jnj.