New 2 Java: Construir una Aplicación: 5.- Escribir Objetos a Ficheros, Usar Arrays y más...

Lee el API de la clase JComboBox. �Qu� l�nea de c�digo es la correcta para hacer que el combo box sea editable?

La forma apropiada para hacer que un combo box sea editable es llamar al m�todo setEditable:

week.setEditable(true);

.�Identificadores para Componentes GUI

JComboBox es s�lo una de las pocas caracter�sticas GUI que vamos a utilizar en la clase UIWestPanel, por eso debemos importar los paquetes javax.swing y java.awt. Los componentes GUI incluyen alguna funcionalidad como desplegar un mensaje y tambi�n necesitamos implementar los interfaces ActionListener y ItemListener.

Luego, configuramos las variables necesarias para los componentes. Este panel consta de JLabels y JTextFields. Declaramos variables para cada uno de ellos.

Sigue estos pasos...
  1. Crea un fichero llamado UIWestPanel.java en tu editor de texto.
  2. A�ade las siguientes sentencias import:
    package divelog;
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    
  3. A�ade la siguiente declaraci�n de clase:
    public class UIWestPanel extends JPanel 
                     implements ActionListener, ItemListener
      { //Opens class
      
  4. Declara las siguientes variables:
         private JLabel diveNumber = new JLabel("Dive #: ");
         private JLabel diveNumberL = new JLabel();
         private JLabel menu2 = new JLabel("Maximum Depth");
         private JLabel jelly = new JLabel("", 
                  new ImageIcon("images/jellyfish.jpg"), 
                                         JLabel.CENTER);     
         private JLabel dateL = new JLabel("Date: " );
         private JTextField date = new JTextField("00/00/00");                                     
         private JComboBox maxDepths = new JComboBox(depths);
         private JLabel psiStartL = new JLabel("PSI Start:");
         private JTextField psiStart = new JTextField("0000");
         private JLabel psiEndL = new JLabel("PSI End:");
         private JTextField psiEnd = new JTextField("000");
         private JLabel psiUsedL = new JLabel("PSI Used:");
         private JLabel psiUsed = new JLabel();
         private JLabel bottomTimeL = new JLabel("Time in Minutes:");
         private JTextField bottomTime = new JTextField("00");
         private JLabel visL = new JLabel("Visibility:");
         private JTextField vis = new JTextField("000");
         private JLabel location = new JLabel("Dive Type: "); 
                        
         private JRadioButton rb;
         private JRadioButton boatButton; 
         private JRadioButton shoreButton; 
         
         // To hold result for ButtonGroup
         private JRadioButton b;
         private JLabel blank = new JLabel(" ");
         protected JButton view;
         protected JButton enter;
         private int count = 0;
         
         //String for JComboBox result
         private String s;
    
  5. Graba el fichero.

Tu fichero UIWestPanel.java se deber�a parecer a este ejemplo.

Ahora empezaremos con el constructor de la clase seleccionando la distribuci�n de este panel como BorderLayout, y seleccionado el color de fondo a white.

Sigue estos pasos...
  1. Abre el fichero UIWestPanel.java en tu editor de texto.
  2. Inicia el constructor de la clase:
    public UIWestPanel ()
     { // Open constructor
    
      } // Closes constructor
    
  3. A�ade los m�todos set para el color de fondo y la distribuci�n como se muestra en negrita:
     public UIWestPanel ()
      { // Open constructor
           setLayout(new BorderLayout());
           setBackground(Color.white);   
      } // Closes constructor
      
  4. Graba el fichero.

Ya est�mos listos para trabajar con los componentes individuales de este panel. En secciones anteriores de este curso ya has construido campos de texto, por eso no los cubrimos aqu� en detalle. Frecuentemente las aplicaciones necesitan componentes que puedan ofrecer sugerencias al usuario. Una forma es darle al usuario un men� desplegable con un lista de �tems que el usuario pueda seleccionar, o botones de radio en los que el usuario pueda seleccionar un �tem. Para crear estas caracter�sticas, utilizamos las clases JComboBox y JRadioButton.

.�Combo Boxes

Creado con la clase JComboBox, un combo box es un objeto con un �rea editable (si se desea) y una lista desplegable de �tems seleccionables. Los ejemplares de JComboBox no son editables por defecto, pero se pueden hacer editables llamando al m�todo setEditable.

Para crear un JComboBox, llamamos a uno de los siguientes constructores:

  • JComboBox(): Crea un combo box por defecto.
  • JComboBox(ComboBoxModel aModel): Crear un combo box que toma los �tems de un ComboBoxModel existente.
  • JComboBox(Object[] items): Crea un combo box que contiene los elementos del array especificado.
  • JComboBox(Vector items): Crea un combo box que contiene los elementos del Vector especificado.

La clase UIWestPanel llama al constructor de JComboBox y le suministra un array de String para crear la lista de �tems.

Un array es un objeto o estructura de datos que contiene m�ltiples elementos del mismo tipo. Los arrays se usan frecuentemente en aplicaciones que necesitan una agrupaci�n de datos asignados a una variable. En este caso, usaremos un array de String para contener varias profundidades de inmersi�n de las que el usuario podr� elegir una.

Podemos definir los arrays de muchas formas. Para el combo box que est�mos creando, la t�cnica m�s f�cil es rellenar el array con los strings a mostrar en el men� desplegable. El siguiente ejemplo muestra un array de strings con los d�as de la semana:

String days[] = {"Sunday", "Monday", "Tuesday", 
   "Wednesday",  "Thursday", "Friday", "Saturday"};
    
// This array is populated with seven String objects. 
// Because they are strings, they must be enclosed in 
// quotes. 

Una vez que se ha definido el array, lo pasamos al constructor de JComboBox:

JComboBox week;
String days[] = {"Sunday", "Monday", "Tuesday", 
   "Wednesday",  "Thursday", "Friday", "Saturday"};
week = new JComboBox(days);

Despu�s de inicializar un combo box con un array para proporcionar los �tems del men� desplegable, podemos seleccionar cu�ndos de esos �tems de la lista se mostrar�n de una vez. Si hay m�s �tems que el n�mero especificado, aparecer�n barras de desplazamiento para que el usuario pueda ver los otros �tems de la lista. Seleccionamos el n�mero m�ximo de filas llamando al m�todo setMaximumRowCount y proporcionado un int con el n�mero de �tems a mostrar:

week.setMaximumRowCount(5);
M�s Componentes GUI para la Entrada de Usuario

Un objeto JComboBox usa un objeto ListCellRenderer para determinar c�mo se muestran los elementos. Adem�s tambi�n utiliza un objeto ComboBoxModel para proporcionar m�todos para acceder a los elementos del combo box.

Cuando el usuario hace expl�citamente una selecci�n, el JComboBox dispara un ActionEvent, y el m�todo actionPerformed define que deber�a suceder como resultado de esta selecci�n.

Otro m�todo que utilizaremos es getSelectedItem, al que se le llama posteriormente en el m�todo actionPerformed. El m�todo getSelectedItem devuelte el �tem seleccionado actualmente.

Sigue estos pasos...
  1. Abre el fichero UIWestPanel.java en tu editor de texto.
  2. A�ade la siguiente definici�n de array de strings al constructor:
    public UIWestPanel ()
     { // Open constructor
      setLayout(new BorderLayout());
      setBackground(Color.white);
      // Define string array for the combo box.
      String[] depths = { "1", "10", "20", "30", "40", 
                  "50","60", "70", "80", "90", "100", "120", 
                               "140", "160 ", "180", "200" }; 
    
  3. Pasa la referencia del array al constructor de JComboBox:
    maxDepths = new JComboBox(depths);
      } // Closes constructor
    
  4. Selecciona el n�mero m�ximo de filas a 5, el color de fondo como white, y selecciona el m�todo setEditable a true:
      // Define string array for combo box.
      String[] depths = { "1", "10", "20", 
            "30", "40", "50","60", "70", "80", "90", 
                  "100", "120", "140", "160 ", "180", 
                                             "200" }; 
     maxDepths = new JComboBox(depths);
     maxDepths.setMaximumRowCount(5);
     maxDepths.setBackground(Color.white);
     maxDepths.setEditable(true);
    
  5. Registra el componente con un ActionListener:
     maxDepths.setBackground(Color.white);
     maxDepths.addActionListener(this);
     maxDepths.setEditable(true);
     maxDepths.addActionListener(this);
      } // Closes constructor  
    
  6. Graba el fichero.
Nota:
Podemos modificar el n�mero de filas a mostrar utilizando el m�todo setMaximumRowCount a m�s o menos, seg�n prefiramos. Adem�s, este men� es editable para que el usuario pueda cambiar 50 por 52, o cualquier otro incremento que necesite.

.�Radio Buttons

Los botones de radio aparecen por defecto como peque�os c�rculos, y se pueden asociar con alg� de texto. Se crean en un grupo de los que s�lo se puede seleccionar un bot�n. Cuando se selecciona un bot�n, cualquier otro que estuviera seleccionado se deselecciona.

Usamos uno de los constructores de JRadioButton para crear botones de radio, dependiendo de nuestras necesidades:

  • JRadioButton()
    Crea un boton de radio inicialmente no seleccionado y sin texto.
  • JRadioButton(Icon icon)
    Crea un bot�n de radio inicialmente no seleccionado con la imagen especificada, pero sin texto.
  • JRadioButton(Icon icon, boolean selected)
    Creaun bot�n de radio con la imagen y el estado de selecci�n especificados, pero sin texto.
  • JRadioButton(String text, Icon icon)
    Crea un bot�n de radio inicialmente no seleccionado, con la imagen y el texto especificados.
  • JRadioButton(String text, Icon icon, boolean selected)
    Crea un bot�n de radio con la imagen, el texto y el estado de selecci�n especificados.

Adem�s de crear los botones, tambi�n debemos a�adirlos a un grupo de botones para que s�lo uno de ellos pueda estar seleccionado.

Aqu� tenemos los cinco pasos para crear un grupo de botones de radio:

  1. Creamos los botones con la clase JRadioButton:
    JRadioButton b1 = new JRadioButton("Shark");
    JRadioButton b2 = new JRadioButton("Tuna"); 
    JRadioButton b3 = new JRadioButton("Dolphin");
    
  2. Regristramos lo botones con un ItemListener:
    b1.addItemListener(this);
    b2.addItemListener(this);
    b3.addItemListener(this);
    
  3. Creamos un objeto ButtonGroup:
    ButtonGroup bg = new ButtonGroup();
    
  4. A�adimos los botones al grupo de botones:
    bg.add(b1);
    bg.add(b3);
    bg.add(b3);
    
  5. A�adimos los botones de radio al panel:
    JPanel p = new JPanel();
    p.add(b1);
    p.add(b2);
    p.add(b3);
    

Cuando se selecciona un bot�n de radio, se genera un ItemEvent y se llama al m�todo itemStateChanged. Dentro de este m�todo, proporcionamos el c�digo para lo que queremos que suceda cuando se selecciona un bot�n de radio. En el caso del panel Log Dives, queremos saber qu� bot�n estaba seleccionado obteniendo el nombre del bot�n. Para obtener el originador de un evento, llamamos al m�todo getItemSelectable.

Sigue estos pasos...
  1. Abre el fichero UIWestPanel.java en tu editor de texto.
  2. Llama a los constructores de JRadioButtons, suministrando strings para el texto de acompa�amiento:
    maxDepths.setEditable(true);
    
    boatButton = new JRadioButton("Boat");
    shoreButton = new JRadioButton("Shore");
    shoreButton.setBackground(Color.white);
    boatButton.setBackground(Color.white);
    
  3. Registra el componente con un ItemListener:
    //Adding listeners for functionality
    shoreButton.addItemListener(this);
    boatButton.addItemListener(this);
    
    
  4. Crea un grupo de botones para estos dos botones de radio, y a�ade los botones al grupo:
    
    ButtonGroup group = new ButtonGroup();
    group.add(boatButton);
    group.add(shoreButton);
    
    
  5. Graba el fichero.

.�Completar el Constructor

Ahora crearemos dos botones, uno que permiten al usuario grabar la informaci�n de la inmersi�n y otro que permite leer los datos de otra inmersi�n. Por ahora estos botones son gen�ricos. M�s adelante, les asignaremos texto y funcionalidad. Recuerda que UIWestPanel se concentra en los componentes GUI, no en la funcionalidad.

Una vez que hemos creado las etiquetas, los botones y los botones de radio que necesitamos, creamos un panel para a�adirlos y luego a�adimos el panel al propio panel. Esto completa el constructor de la clase UIWestPanel.

Sigue estos pasos...
  1. Abre el fichero UIWestPanel.java en tu editor de texto.
  2. Inicializa dos JButtons gen�ricos:
    ButtonGroup group = new ButtonGroup();
    group.add(boatButton);
    group.add(shoreButton);
    
    view = new JButton();
    enter = new JButton();
    
  3. Crea un panel y a��dele los componentes que hemos creado:
    
    //Create panel for components
    JPanel wpanel = new JPanel(new GridLayout(14, 2, 0, 0));
    wpanel.setBackground(Color.white);
    //Add components       
    //Combo Box for depth of dive
    wpanel.add (menu2);
    wpanel.add (maxDepths);
    wpanel.add(dateL);
    wpanel.add(date);
    wpanel.add(location);
    wpanel.add(blank);
    wpanel.add(shoreButton);
    wpanel.add(boatButton);
    wpanel.add(Box.createVerticalStrut(3));
    wpanel.add(Box.createVerticalStrut(3));
    wpanel.add(psiStartL);
    wpanel.add(psiStart);
    wpanel.add(psiEndL);
    wpanel.add(psiEnd);
    wpanel.add(psiUsedL);
    wpanel.add(psiUsed);
    wpanel.add(bottomTimeL);
    wpanel.add(bottomTime);
    wpanel.add(visL);
    wpanel.add(vis);
    wpanel.add(diveNumber);
    wpanel.add(diveNumberL);
    wpanel.add(enter);
    wpanel.add(view);
    
    
  4. Graba el fichero.

Como la clase UIWestPanel construye las caracter�sticas GUI, copia el c�digo del �rea de texto y la imagen del tibur�n a un panel y dentro de este constructor. El panel con estos objetos se puede a�adir al �rea East del panel:

Sigue estos pasos...
  1. Abre el fichero UIWestPanel.java en tu editor de texto.
  2. A�ade el c�digo para el �rea de texto y la imagen del tibur�n para este constructor:
    //Define textarea, and create panel
    //for textarea, shark, and button
    JPanel cpanel = new JPanel();
    comments = new JTextArea(15, 10);
    comments.setLineWrap(true);
    comments.setWrapStyleWord(true);     
    scrollpane = new JScrollPane(comments);
    scrollpane.setVerticalScrollBarPolicy(
         JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    whiteshark = new JLabel("", 
               new ImageIcon("images/gwhite.gif"), 
                                    JLabel.CENTER);
    box = Box.createVerticalBox();
    box.add(scrollpane);
    box.add(Box.createVerticalStrut(35));
    box.add(whiteshark);
    cpanel.setBackground(Color.white);
    cpanel.add(box);
    
  3. A�ade los paneles al panel:
          
    //Add panels to border layout of 
    // Dives object.
    add(jelly, "North");
    add(cpanel, "East");
    add(wpanel, "West");     
     } // Closes constructor
    

Ya hemos completado los componentes gr�ficos para este interface. Cuando se llama al constructor de la clase UIWestPanel desde otra clase, se construye el GUI y est� listo para introducir datos. Algunos de estos componentes tienen alguna funcionalidad que implementaremos en esta clase, pero la funcionalidad principal de los botones va en la clase controladora que crearemos m�s adelante.

.�Implementar los M�todos Prometidos

El constructor de la clase UIWestPanel ya est� completo, pero la propia clase no lo est�. Recuerda que esta clase implementa los interfaces ActionListener y ItemListener, lo que significa que debemos implementar los m�todos espec�ficos en esta clase. En estos m�todos, proporcionaremos unas pocas instrucciones para lo que queremos que suceda cuando se utilice el componente gr�fico.

�Qu� m�todos tenemos que implementar?
  A  
public void getSize(int size)
public void getComponent(Component c)
  B.  
public void actionPerformed(ActionEvent ae)
public void itemStateChanged(ItemEvent ie)
  C   Todos los de arriba.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR

SIGUIENTE ARTÍCULO