Aprendiendo Java en "serio" ... [006]

Aprendiendo Java en "serio" ... [006]

Temario muy básico de Java

  1. Compilar y ejecutar programas Java: java, javac,etc.
  2. Arreglos: vectores y matrices
  3. Introducir datos en Java: Scanner, BufferedReader, JOptionPane, etc.
  4. Uso de Collections: List, HashMap, etc.
  5. Java Swing básico
  6. Proyecto sencillo no.1
  7. IDEs: Eclipse y NetBeans
  8. Java y las base de datos
  9. Proyecto sencillo no.2
  10. Java y XML
  11. Frameworks

Java Swing básico

Swing es el conjunto de clases, interfaces, etc. que nos permite construir aplicaciones de escritorio. Para usar los controles y el manejo de eventos es necesario importar las librerías javax.swing.* y
java.awt.*, cada uno de los controles (JButton,JLabel, JTextField, etc.) posee una serie de características propias. Es importante leer la documentación del lenguaje, este post solo es una muestra de lo que se puede hacer con estas librerías.

Ej. no. 0 ... primer ventana

En este ejemplo solo mostramos una ventana con un JLabel. Para los ejercicios es necesario tener la librería Nimbus (es para el aspecto de las ventanas).

import java.awt.*;
import javax.swing.*;

public  class Ventana extends JFrame{

/*constantes para ancho y alto de la ventana*/
  public static final int ANCHO=300;
  public static final int ALTO=250;

  /*constructor de la clase*/
    public Ventana(){
             setTitle("Aprendiendo Java en serio");
                 setVisible(true);
                 setSize(ANCHO,ALTO);
                 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                 add(getPanel());
        }
       
       
        public JPanel getPanel(){
          panel=new JPanel();
         panel.add(new JLabel("<html><h1><font color='green'>Java</font><font color='white'>    México</font><sup><font color='red'>    2.0</font></sup></h1></html>"));
           return panel;
        }
       
  public static void main(String ... args)throws Exception{
 
    for(UIManager.LookAndFeelInfo laf:UIManager.getInstalledLookAndFeels()){
          if("Nimbus".equals(laf.getName()))
        try {
                UIManager.setLookAndFeel(laf.getClassName());
            new Ventana();
           
                }
                catch (ClassNotFoundException e) {
                        System.out.println("[Main.main:ClassNotFoundException]"+ e.getMessage());
                }
                catch (InstantiationException e) {
                        System.out.println("[Main.main:InstantiationException]"+ e.getMessage());
                }
               
        }
  }
 
}

Compilar: javac -g Ventana.java
Ejecutar:java Ventana

Manejo de eventos: listener

Por lo general esta es la forma en la que se define y asigna un listener a un componente:

componente.addActionListener(new ActionListener(){
               public void actionPerformed(ActionEvent e){
                    // la acción a realizar
           }
});

Ej. no. 1 ... activar una ventana externa

Para este ejemplo volvemos a usar la ventana anterior, pero le agregamos dos botones (JButton), el primero activa una ventana y el otro es para finalizar la aplicación.
Ventana.java

import java.awt.*;
import javax.swing.*;
import javax.swing.UIManager;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JButton;
import java.awt.event.*;

public  class Ventana extends JFrame{

private JPanel panel;
private JButton btnActiva;

    public Ventana(){
             setTitle("Aprendiendo Java en serio");
                 setVisible(true);
                 setSize(350,250);
                 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);       
                 add(getPanel());
        }
       
        public JPanel getPanel(){
          panel=new JPanel();
         
          btnActiva=new JButton("<html><font color='red'>Activa</font></html>");
          btnActiva.setToolTipText("activa evento");
         
         
           btnCerrar=new JButton("<html><font color='blue'>Quitar</font></html>");
          btnCerrar.setToolTipText("salir");
         
         
          btnActiva.addActionListener(new ActionListener(){
               public void actionPerformed(ActionEvent e){
                   Tuto13 t13=new Tuto13();
                       panel.add(t13.getGUI());
                   }
         
          });
         
         
          btnCerrar.addActionListener(new ActionListener(){
               public void actionPerformed(ActionEvent e){
                   System.exit(0);
                   }
         
          });
         
          panel.add(new JLabel("<html><h1><font color='green'>Java</font><font color='white'>    México</font><sup><font color='red'>    2.0</font></sup></h1></html>"));
          panel.add(btnActiva);
           panel.add(btnCerrar);
           return panel;
        }

       
        /*método principal del programa*/
  public static void main(String ... args)throws Exception{
 
    for(UIManager.LookAndFeelInfo laf:UIManager.getInstalledLookAndFeels()){
          if("Nimbus".equals(laf.getName()))
        try {
                UIManager.setLookAndFeel(laf.getClassName());
            new Ventana();
           
                }
                catch (ClassNotFoundException e) {
                        System.out.println("[Main.main:ClassNotFoundException]"+ e.getMessage());
                }
                catch (InstantiationException e) {
                        System.out.println("[Main.main:InstantiationException]"+ e.getMessage());
                }
               
        }
  }
 
}

Otra.java

import java.awt.*;
import javax.swing.*;

public class Otra extends JFrame{
private JPanel panel;

  public Otra(){
 
    setTitle("Créditos");
                 setVisible(true);
                 setSize(350,250);
                 
                 
                 add(getGUI());
 
 
  }
 
 
  public JPanel getGUI(){
     panel=new JPanel();
    panel.add(new JLabel("<html><h1>Autor</h1></html>"));        
    return panel;
  }
  }

Compilar: javac -g Ventana.java
Ejecutar: java Ventana
Debe aparecer esto:
al presionar el botón (Activa) aparece la siguiente ventana

Ej. no. 2 ... factorial de un número

Factorial.java

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class Factorial extends JFrame{
private JButton btnCalcula,btnSalir;
private JTextField txtNumero;
private JPanel panel;
private  JLabel lblResult;
   
public static final int ANCHO=400;
public static final int ALTO=300;

   public Factorial(){
     setTitle("::Factorial::");
         setVisible(true);
     setSize(ANCHO,ALTO);
         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);       
         add(getGUI());
   }
   
   
   /*función para calcular el factorial*/
   public static int factorial(int n){
     if(n==0){
            return 1;
         }else{
            return n * factorial(n-1);
         }
   
   }
   
   
   public void limpia(){
     txtNumero.setText("");
   }
   
   
   
   
   public JPanel getGUI(){
    panel=new JPanel();
       
       
        txtNumero=new JTextField(6);
        txtNumero.setToolTipText("debes colocar un número");
       
       
        btnCalcula=new JButton("<html><font color='white'><b>Calcular</b></font></html>",new ImageIcon("SRN4.jpg"));
    btnCalcula.setToolTipText("calcular factorial");
    btnCalcula.setBackground(Color.blue);
       
       
       
        btnSalir=new JButton("<html><font color='yellow'><b>Salir</b></font></html>",new ImageIcon("SRN4.jpg"));
    btnSalir.setToolTipText("quitar aplicación");
    btnSalir.setBackground(Color.red);
       
       
        lblResult=new JLabel("<html><b><font color='red'> </font></b></html>");
        lblResult.setVisible(false);
       
   /*para el botón calcula*/
    ActionListener actionListener1= new ActionListener(){
            public void actionPerformed(ActionEvent ev){
                  /*evento*/
                  int res=factorial( Integer.parseInt(txtNumero.getText()));  
                  lblResult.setText(String.valueOf(res));
                  lblResult.setVisible(true);
                 
                  limpia();
                 
                   
                }
        };
       
       
        /*para el botón salir*/
    ActionListener actionListener2= new ActionListener(){
            public void actionPerformed(ActionEvent ev){
                  /*evento*/
                  System.exit(0);
                }
        };
       
       

        /*asignar listeners*/
        btnCalcula.addActionListener(actionListener1);
        btnSalir.addActionListener(actionListener2);
   
       
        panel.add(new JLabel("<html><b><font color='green'>Número entero:</font></b></html>"));
        panel.add(txtNumero);
    panel.add(btnCalcula);
        panel.add(new JLabel("<html><b><font color='blue'>resultado: </font></b></html>"));
        panel.add(lblResult);
          panel.add(btnSalir);
       
        return panel;  
   }
   
    /*método principal del programa*/
  public static void main(String ... args)throws Exception{
 
    for(UIManager.LookAndFeelInfo laf:UIManager.getInstalledLookAndFeels()){
          if("Nimbus".equals(laf.getName()))
        try {
                UIManager.setLookAndFeel(laf.getClassName());
            new Factorial();
           
                }
                catch (ClassNotFoundException e) {
                        System.out.println("[Main.main:ClassNotFoundException]"+ e.getMessage());
                }
                catch (InstantiationException e) {
                        System.out.println("[Main.main:InstantiationException]"+ e.getMessage());
                }
               
        }
  }
       
       

}

Compilar: javac -g Factorial.java
Ejecutar:java    Factorial

Basta que pongas un número entero, presiones el botón Calcular para que aparezca el resultado

Ej. no. 3 ... uso de JOptionPane

Mensajes.java

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class Mensajes extends JFrame{
private JButton btnMsg1,btnMsg2,btnMsg3,btnSalir;
private JPanel panel;

public static final int ANCHO=500;
public static final int ALTO=400;

 /*método principal del programa*/
  public static void main(String ... args)throws Exception{
 
    for(UIManager.LookAndFeelInfo laf:UIManager.getInstalledLookAndFeels()){
          if("Nimbus".equals(laf.getName()))
        try {
                UIManager.setLookAndFeel(laf.getClassName());
            new Mensajes();
           
                }
                catch (ClassNotFoundException e) {
                        System.out.println("[Main.main:ClassNotFoundException]"+ e.getMessage());
                }
                catch (InstantiationException e) {
                        System.out.println("[Main.main:InstantiationException]"+ e.getMessage());
                }
               
        }
  }
 
  public Mensajes(){
     setTitle("::Uso de JOptionPane::");
         setVisible(true);
     setSize(ANCHO,ALTO);
         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);       
         add(getGUI());
  }
 
  public JPanel getGUI(){
   panel=new JPanel();
   
   
   btnMsg1=new JButton("<html><font color='white'><b>Mensaje no. 1</b></font></html>",new ImageIcon("SRN4.jpg"));
    btnMsg1.setToolTipText("uso de JOptionPane.showInputDialog");
    btnMsg1.setBackground(Color.blue);
       
        btnMsg1.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent ev){
             String nombre=JOptionPane.showInputDialog("Tu nombre es:");
                 JOptionPane.showMessageDialog(null,"Hola  "+nombre);
        }
        });
       
       
        btnMsg2=new JButton("<html><font color='white'><b>Mensaje no. 2</b></font></html>",new ImageIcon("SRN4.jpg"));
    btnMsg2.setToolTipText("uso de JOptionPane.showConfirmDialog");
    btnMsg2.setBackground(Color.blue);
       
        btnMsg2.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent ev){
             int confirmado = JOptionPane.showConfirmDialog( null,
   "¿Te gusto este tutorial de Swing?");

if (JOptionPane.OK_OPTION == confirmado){
   JOptionPane.showMessageDialog(null,"Que bueno que te gusto, espero realizar más ejemplos");
   }
   else if(JOptionPane.CANCEL_OPTION == confirmado){
   JOptionPane.showMessageDialog(null,"operación cancelada");
   }
   
else{
   JOptionPane.showMessageDialog(null,"Bien, se hace lo que se puede");
        }
        }
        });
       
       
       
       
        btnMsg3=new JButton("<html><font color='white'><b>Mensaje no. 3</b></font></html>",new ImageIcon("SRN4.jpg"));
    btnMsg3.setToolTipText("uso de  JOptionPane.QUESTION_MESSAGE");
    btnMsg3.setBackground(Color.blue);
       
        btnMsg3.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent ev){
             Object seleccion = JOptionPane.showInputDialog(
   null,
   "¿Qué tipo de usuario es?",
   "Selector de opciones",
   JOptionPane.QUESTION_MESSAGE,
   new ImageIcon("SRN4.jpg"),  
   new Object[] { "Soy cocinero de software", "Yo odio programar en Java", "perdón ¿cuál era la pregunta?" },
   "Soy cocinero de software");

JOptionPane.showMessageDialog(null,"El usuario ha elegido [ "+seleccion+"]");
        }
        });
       
       
       
        btnSalir=new JButton("<html><font color='red'><b>Salir</b></font></html>",new ImageIcon("SRN4.jpg"));
    btnSalir.setToolTipText("quitar");
    btnSalir.setBackground(Color.yellow);
       
        btnSalir.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent ev){
             System.exit(0);
        }
        });
   
   
  /*contenedor*/
  Box cajaVertical=Box.createVerticalBox();
  cajaVertical.add(Box.createVerticalStrut(10));
  cajaVertical.add(btnMsg1);
  cajaVertical.add(btnMsg2);
  cajaVertical.add(btnMsg3);
  cajaVertical.add(btnSalir);
 
 
   panel.add(cajaVertical,BorderLayout.CENTER);  
   return panel;
  }

}

Compilar: javac -g Mensajes.java
Ejecutar:java    Mensajes


Java Swing vs Microsoft .Net (Windows Forms)

Ventajas de .Net

  • Supera a Swing visualmente
  • Existen una gran cantidad de controles, además puedes crear tus propios controles personalizados
  • La mayoría usa Microsoft Windows
  • Existe mucho soporte por parte de Microsoft


Desventajas de .Net

  • Tus aplicaciones solo funcionan en Microsoft Windows
  • No siempre funcionan tus aplicaciones en otra máquina (con Windows), incluso si tiene exactamente la misma configuración


Ventajas de Swing

  • Tus aplicaciones funcionan en cualquier SO
  • Puedes distribuir tus aplicaciones mejor que en .Net


Desventajas Swing

  • A veces se queda trabada o "congelada" la aplicación
  • Las aplicaciones en .Net se ven mejor

¿Cómo crear un jar?

Crea una carpeta y nombrala META-INF, dentro de la carpeta crea otro archivo y nombralo MANIFEST.MF y escribe dentro:

Manifest-Version: 1.0
Main-Class: Clase
Name: Clase.class, Clase$1.class, Clase$2.class
Java-Bean: True

Dependiendo del número de clases que contenga tu aplicación y además si incluyes alguna imagen. Ahora dentro de la terminal de comandos (Windows o Linux):

jar  Nombre.jar  META-INF/MANIFEST.MF  *.class *.jpg

El chiste de este tutorial es leer la documentación del lenguaje, hacer los ejercicios, investigar y preguntar ... no hay soluciones mágicas.

Post anteriores

  1. Presentación del tutorial
  2. Compilar y ejecutar programas java con comandos
  3. Arreglos: vectores y matrices
  4. Introducir datos en Java: Scanner, BufferedReader, JOptionPane, etc.
  5. Uso de Collections: List, HashMap, etc.


El que quiere aprender aprende

Las imágenes de Homero Simpson son propiedad de Matt Groening.

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de Sr. Negativo

Descomprimir solo archivos xml y pdf

Descomprimir archivos

Me faltó poner este ejemplo:

import java.io.File;
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JLabel;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

/**
*@author yo
*
*/

public class Descomprime extends JFrame{
private JButton btnAbre,btnCerrar;
private JPanel panel;
private JTextField txtRuta;

public static final int BUFFER = 2048;
public static final int ANCHO=800;
public static final int ALTO=200;

   public Descomprime(){
   setTitle("::Descomprimir archivo *.zip (pdfs y xmls)::");
         setVisible(true);
     setSize(ANCHO,ALTO);
         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);       
         add(getGUI());  
   }

   
   public static void main(String ... args)throws Exception{
            for(UIManager.LookAndFeelInfo laf:UIManager.getInstalledLookAndFeels()){
          if("Nimbus".equals(laf.getName()))
        try {
                UIManager.setLookAndFeel(laf.getClassName());
            new Descomprime();
                       
        }
                catch (ClassNotFoundException e) {
                        System.out.println("[Main.main:ClassNotFoundException]"+ e.getMessage());
                }
                catch (InstantiationException e) {
                        System.out.println("[Main.main:InstantiationException]"+ e.getMessage());
                }              
        }      
        }
       
       
        public JButton getButton(){
           btnAbre= new JButton("<html><font color='red'><b>Abrir  directorio</b></font></html>",new ImageIcon("SRN4.jpg"));
       btnAbre.setToolTipText("abrir directorio del archivo *.zip");
       btnAbre.setBackground(Color.white);
           
           btnAbre.addActionListener(new ActionListener(){
           public void actionPerformed(ActionEvent ev){
           try{
           
           File selec;
       JFileChooser selArchivo=new JFileChooser();
           selArchivo.showOpenDialog(null);
           selec=selArchivo.getSelectedFile();
           txtRuta.setText(String.valueOf(selec));
           FileInputStream fis=new FileInputStream(txtRuta.getText()); //necesario
        descomprimirGuardar(fis);// necesario
                String todo="Hecho,\n archivo ";
                todo+=selec;
                todo+="    descomprimido correctamente";
                JOptionPane.showMessageDialog(null,todo,"Información",JOptionPane.INFORMATION_MESSAGE,new ImageIcon("SRN4.jpg"));
           }catch(Exception ex){
            JOptionPane.showMessageDialog(null,"No se aceptan valores : "+ex.getCause());
           }
           
           
           
        }
        });
       
           
           
           
           return btnAbre;
        }
       
       
        public JButton getButton2(){
        btnCerrar=new  JButton("<html><font color='white'><b>Salir</b></font></html>");
       btnCerrar.setToolTipText("finalizar");
       btnCerrar.setBackground(Color.red);
           btnCerrar.addActionListener(new ActionListener(){
           public void actionPerformed(ActionEvent ev){
           System.exit(1);
           }
           
           });
       
        return btnCerrar;
        }
       
        public JPanel getGUI(){
           panel=new JPanel();
           panel.setVisible(true);
           panel.add(getButton());
           panel.add(new JLabel("Ruta: "));
           
           txtRuta=new JTextField(34);
           txtRuta.setEnabled(false);
           txtRuta.setToolTipText("ruta y nombre del archivo");
           
           panel.add(txtRuta);
           panel.add(getButton2());
           return panel;
        }
       
       
        //descomprimir y guardar en directorio por default
 public  void descomprimirGuardar(FileInputStream fis){
 try {
         BufferedOutputStream dest = null;
         ZipInputStream zis = new       ZipInputStream(new BufferedInputStream(fis));
         ZipEntry entry;
         while((entry = zis.getNextEntry()) != null) {
// System.out.println("Extrayendo: " +entry);
  //si no es directorio
if(!entry.isDirectory()){
if(esPDF(entry)){
   System.out.println(entry+"  >>> es pdf: "+esPDF(entry));
    descomprime(entry,dest,zis);
}
if(esXML(entry)){
  System.out.println(entry+"  >>> es xml: "+esXML(entry));
   descomprime(entry,dest,zis);
}
}

//si es directorio
if(entry.isDirectory()){
    System.out.println("[Directorio encontrado]");
if(esPDF(entry)){
    System.out.println(entry+" >>>  es pdf: "+esPDF(entry));
    descomprime(entry,dest,zis);
}
if(esXML(entry)){
   System.out.println(entry+" >>> es xml: "+esXML(entry));
   descomprime(entry,dest,zis);
}
}
}
zis.close();
}
catch(Exception e) {e.printStackTrace();}

 }
//proceso para descomprimir
 public void descomprime(ZipEntry entry,BufferedOutputStream dest,ZipInputStream zis) throws IOException{

     try{
       int count;
            byte[] data = new byte[BUFFER];
            FileOutputStream fos = new  FileOutputStream(entry.getName());
            dest = new BufferedOutputStream(fos, BUFFER);
            while ((count = zis.read(data, 0, BUFFER))!= -1) {
               dest.write(data, 0, count);
            }

     }catch(Exception exc){
     }
     dest.flush();
     dest.close();
 }

  //si es pdf
 public boolean esPDF(ZipEntry arch){
      if(arch.getName().endsWith("pdf"))
         return true;
 return false;
 }
//si es xml
 public boolean esXML(ZipEntry arch){
     if(arch.getName().endsWith("xml"))
         return true;
 return false;
 }

}

Compilar: javac -g   Descomprime.java
Ejecutar:java Descomprime
Presionas el botón Abrir directorio

seleccionas el archivo *.zip y solo descomprime los archivos con extensión *.xml y *.pdf

Imagen de hugruby

librerias

estaría bien que se cambiara la palabra por bibliotecas.

Imagen de Sr. Negativo

Bibliotecas por librerías

Gracias por la corrección, pero no he podido editar el post (... )