Tutorial de Java

Listas y Cajas Combinadas

Anterior | Siguiente

Las lista y cajas "combo" en Swing funcionan del mismo modo que lo hacían en el AWT, aunque tienen incrementada la funcionalidad a través de algunas funciones de conveniencia que se han incorporado. Por ejemplo, JList tiene un constructor al que se puede pasar un array de objetos String para que los presente. El ejemplo java1407.java, muestra el uso básico de estos dos componentes.

import java.awt.*;
import java.awt.event.*;
import com.sun.java.swing.*;

public class java1407 extends JPanel {
  
  public java1407() {
    setLayout( new GridLayout( 2,1 ) );
    
    JList lista = new JList( java1406.ids );
    add( new JScrollPane( lista ) );
    
    JComboBox combo = new JComboBox();
    for( int i=0; i < 100; i++ )
      combo.addItem( Integer.toString( i ) );
    add( combo );
  }
  
  public static void main( String args[] ) {
    java1407 lista = new java1407();
    JFrame ventana = new JFrame();
    
    ventana.getContentPane().add( lista,BorderLayout.CENTER );
    
    ventana.addWindowListener( new WindowAdapter() {
      public void windowClosing( WindowEvent evt ) {
	System.exit( 0 );
      }
    } );
    
    ventana.setSize( 200,200 );
    ventana.setTitle( "Tutorial de Java, Swing" );
    ventana.setVisible( true );
  }
}

La imagen siguiente es el resultado que se obtiene en pantalla tras la ejecución del ejemplo, y después de haber seleccionado uno de los elementos en la caja combo y abrirla para proseguir la selección de otra de las opciones o elementos que se permite elegir.

Una cosa que se ha mantenido con respecto a las listas de antes es que los objetos JList no proporcionan automáticamente la posibilidad de scroll o desplazamiento del contenido, que es una cosa que se espera que haga automáticamente, y resulta un poco chocante. No obstante, el añadir scroll a listas es sumamente sencillo, ya que es suficiente con incluir la JList en un JScrollPane, y todos los detalles del desplazamiento del contenido serán ya manejados bajo la responsabilidad del sistema.

Aunque lo más frecuente es que cada elemento seleccionable de una lista sea una etiqueta, Swing proporciona al componente JList también la posibilidad de presentar gráficos, con o sin texto asociado, y también proporciona un control adicional de eventos para adecuarse a los que se producen en la manipulación de este tipo de Componentes. Es decir, que en una lista también se pueden incluir instancias de clases como JButton, JTextField, JCheckBox, e incluso JTextArea, que es un componente multilínea.

En el ejemplo java1408.java se muestra precisamente una lista en la que se utilizan instancias de la clase JTextArea, para mostrar los valores que se cargan en la lista, que corresponden a un extracto del índice del Tutorial:

    "Capitulo 4\nIntroduccion al Lenguaje Java",
    "Capitulo 5\nConceptos Basicos de Java",
    "Capitulo 6\nProgramas Basicos en Java",
    "Capitulo 7\nEl Depurador de Java",
    "Capitulo 8\nClases Java",
    "Capitulo 9\nExcepciones en Java"

Cada valor incluye el carácter de nueva línea, \n, para forzar el salto de línea en medio del texto.

class MiRendererDeLista extends JTextArea implements ListCellRenderer {
    
  public Component getListCellRendererComponent(
    JList lista,Object valor,int indice,
    boolean seleccionado, boolean conFoco ) {

    setBorder( new BevelBorder( BevelBorder.RAISED ) );
    // Presenta el text correspondiente al item
    setText( valor.toString() );
    // Pinta en los colores indicados y con la fuente seleccionada...
    if( seleccionado ) {
      // .. en el caso de un item marcado (rojo/blanco)
      setBackground( Color.red );
      setForeground( Color.white );
    }
    else {
      // .. en el caso de un item no marcado (gris/negro)
      setBackground( Color.lightGray );
      setForeground( Color.black );
    }
    return( this );
  }
}
El código es bastante simple, y la parte más interesante es la correspondiente a la clase anidada MiRendererDeLista, reproducido antes, que implementa un controlador diferente para cada celda de la lista, extendiendo en este caso a JTextArea en lugar de JLabel, como suele ser habitual. El resultado de la ejecución del ejemplo es el que muestra la figura.

Aunque el componente JTextArea también tiene sus limitaciones, como son el no permitir el uso de gráficos, se puede observar que las posibilidades que se presentan al programador se han visto tremendamente incrementadas con la inclusión de este tipo de Componente y con las nuevas características que proporciona Swing. En este caso, incluso es posible hacer que la altura de la celda esté recortada, en el caso de utilizar fuentes de caracteres muy grandes, debido a que la altura de cada uno de los elementos seleccionables de la lista se determina en el momento en que son construidos.

Navegador

Home | Anterior | Siguiente | Indice | Correo