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

ENVIAR A UN AMIGO
COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN GOOGLE +
ARTÍCULO ANTERIOR

SIGUIENTE ARTÍCULO

¡SÉ EL PRIMERO EN COMENTAR!
Conéctate o Regístrate para dejar tu comentario.