Componentes Avanzados: JList

Clase JList

java.lang.Object
java.awt.Component
java.awt.Container
javax.swing.JComponent
javax.swing.JList
Jlist es un lista con componentes... como si fuera un area de texto, pero con la opcion desactivada para escribir, lineas pre-definidas y con la diferencia de generar un evento al seleccionar una de estas lineas.
  1. package avanzado;
  2. import java.awt.*;
  3. import javax.swing.*;
  4. public class Jlist extends JFrame{
  5.     JPanel marco = new JPanel();
  6.     String[] datos = {"siete", "ocho", "nueve", "seis"};
  7.     JList<String> miJLista = new JList<String>(datos);
  8.     Jlist(){
  9.         super("JList en Java");
  10.         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  11.         setSize(247,121);
  12.         setLocationRelativeTo(null);
  13.         marco.add(miJLista);
  14.         marco.setLayout(new FlowLayout());
  15.         add(marco);
  16.         setVisible(true);
  17.     }
  18.     public static void main(String[] args) {
  19.         new Jlist();
  20.     }
  21. }

Atributos:

  • static int HORIZONTAL_WRAP
    • Indica un diseño "estilo periodístico" con las celdas que fluye horizontalmente y luego verticalmente.
  • static int VERTICAL
    • Indica una disposición vertical(de arriba a abajo) de las celdas, en una sola columna; es el diseño predeterminado.
  • static int VERTICAL_WRAP
    • Indica un diseño "estilo periodístico" con las celdas que van verticalmente luego horizontalmente.
Estos atributos define la forma en que las celdas de lista se nos extienden. Consideremos un JList con cinco celdas y estas pueden ser instaladas en una de las siguientes maneras:

VERTICAL:                       0
                                       1
                                       2
                                       3
                                       4

HORIZONTAL_WRAP:   0 1 2
                                    3 4

VERTICAL_WRAP:         0 3
                                     1 4
                                     2

Constructores:

  • JList()
    • Crea un JList con un modelo vacío, de sólo lectura.
  • JList(E[] listData)
    • Crea un JList que muestra los elementos del objeto <E>.
  • JList(ListModel<E> dataModel)
    • Crea un JList que muestra elementos del modelo(ListModel) especificado no-nulo.
  • JList(Vector<? extends E> listData)
    • Crea un JList con los elementos del objeto vector especificado.

Métodos:

  • setDragEnabled (boolean b)
    • Activa o desactiva la administración automática de arrastre.
  • setFixedCellHeight (int altura)
    • Establece un valor fijo que se utilizará para la altura de cada célula en la lista.
  • setFixedCellWidth (int ancho)
    • Establece un valor fijo que se utilizará para la anchura de cada célula en la lista.
  • setLayoutOrientation (int layoutOrientation)
    • Define la forma en las células de lista se nos extienden.
  • setSelectedIndex (int indice)
    • Selecciona una sola célula.
  • setSelectedIndices (int [] índices)
    • Cambia la selección para el conjunto de índices especificados por la matriz dada.
  • setSelectionMode (int SelectionMode)
    • Establece el modo de selección de la lista. Los modos aceptados son:
      • ListSelectionModel.SINGLE_SELECTION
      • ListSelectionModel.SINGLE_INTERVAL_SELECTION
      • ListSelectionModel.MULTIPLE_INTERVAL_SELECTION
  • setSelectionBackground ( color selectionBackground)
    • Establece el color utilizado para dibujar el fondo de los elementos seleccionados, los cuales procesadores de celdas pueden utilizar celdas seleccionadas de relleno.
  • setSelectionForeground ( color selectionForeground)
    • Establece el color utilizado para dibujar el primer plano de los elementos seleccionados, los cuales procesadores de celdas pueden utilizar para representar texto y gráficos.

Componentes Avanzados: JToggleButton, JRadioButton y JSlider

Clase JToggleButton

java.lang.Object
java.awt.Component
java.awt.Container
javax.swing.JComponent
javax.swing.AbstractButton
javax.swing.JToggleButton
La clase JToggleButton nos permite crear botones al igual que JButton con la diferencia que al pulsarlo este queda marcado hasta despulsarlo por asi decirlo.

Constructores:

  • JToggleButton()
    • Crea un toggle button sin seleccionarse inicialmente, sin texto o imagen-icono.
  • JToggleButton(Action a)
    • Crea un toggle button donde se toman las propiedades de la acción que se suministra.
  • JToggleButton(Icon icon)
    • Crea un toggle button con la imagen especificada.
  • JToggleButton(Icon icon, boolean selected)
    • Crea un toggle button con la imagen especificada y estado de la selección indicado.
  • JToggleButton(String text)
    • Crea un toggle button con el texto del parámetro.
  • JToggleButton(String text, boolean selected)
    • Crea un toggle button con el texto del parámetro y estado de la selección indicado.
  • JToggleButton(String text, Icon icon)
    • Crea un toggle button que tiene el texto y la imagen especificada, y que es inicialmente no está seleccionado.
  • JToggleButton(String text, Icon icon, boolean selected)
    • Crea un toggle button que tiene el texto, la imagen especificada, y estado de la selección indicado.

Clase JRadioButton

java.lang.Object
java.awt.Component
java.awt.Container
javax.swing.JComponent
javax.swing.AbstractButton
javax.swing.JToggleButton
javax.swing.JradioButton
Sub-Clase de JToggleButton, seguramente todos habemos vistos más de uno en nuestra vida, son circulos para clickear y seleccionar. Cuenta con los mismos constructores en el sentido de que son 8 y con los mismo parámetros:

Constructores:

  • JRadioButton()
    • Crea un radio botón sin seleccionarse inicialmente, sin texto o imagen-icono.
  • JRadioButton(Action a)
    • Crea un radio botón donde se toman las propiedades de la acción que se suministra.
  • JRadioButton(Icon icon)
    • Crea un radio botón con la imagen especificada.
  • JRadioButton(Icon icon, boolean selected)
    • Crea un radio botón con la imagen especificada y estado de la selección indicado.
  • JRadioButton(String text)
    • Crea un radio botón con el texto del parámetro.
  • JRadioButton(String text, boolean selected)
    • Crea un radio botón con el texto del parámetro y estado de la selección indicado.
  • JRadioButton(String text, Icon icon)
    • Crea un radio botón que tiene el texto y la imagen especificada, y que es inicialmente no está seleccionado.
  • JRadioButton(String text, Icon icon, boolean selected)
    • Crea un radio botón que tiene el texto, la imagen especificada, y estado de la selección indicado.

Button Group:

ButtonGroup nos da la posibilidad de crear una grupo al igual que pasaba con JCheckBox, para solo seleccionar uno a la vez, también es posible para JRadioButton.

Clase JSlider

java.lang.Object
java.awt.Component
java.awt.Container
javax.swing.JComponent
javax.swing.JSlider
Los deslizadores es una barra ajustable por el usuario para configurar algún valor. Generalmente son muy usuadas para ajustar el volumen, brillo, etc.

Constructores:

  • JSlider()
    • Crea un deslizador horizontal con el rango de 0 a 100 y un valor inicial de 50.
  • JSlider(BoundedRangeModel brm)
  • JSlider(int orientation)
    • Crea un deslizador utilizando la orientación especificada con el rango de 0 a 100 y un valor inicial de 50. La orientación puede ser SwingConstants.VERTICAL o SwingConstants.HORIZONTAL.
  • JSlider(int min, int max)
    • Crea un deslizador horizontal utilizando el mínimo y máximo especificado con un valor inicial igual al promedio de los valores mínimo, más máximo
  • JSlider(int min, int max, int value)
    • Crea un deslizador horizontal mediante el mínimo, máximo y el valor inicial especificados.
  • JSlider(int orientation, int min, int max, int value)
    • Crea un slider con la orientación, el mínimo y máximo, y los valores iniciales específicados.

Métodos:

Los más importantes son los accesor(get y set) de los parámetros del constructor: int orientation, int min, int max, int value y estos otros:
  • setMajorTickSpacing(int n)
    • Este método muestra cada cuanto "n" son visibles las marcas grandes.
  • setMinorTickSpacing(int n)
    • Este método muestra cada cuanto "n" son visibles las marcas peueñas.
  • setPaintLabels(boolean b)
    • Determina si las etiquetas(numeros) están pintadas en el deslizador.
  • setPaintTicks(boolean b)
    • Determina si las marcas de graduación se pintan en el deslizador.
  • setPaintTrack(boolean b)
    • Determina si la pista está pintado en el deslizador.

  1. import java.awt.*;
  2. import javax.swing.*;
  3. public class Deslizador extends JFrame{
  4.     JSlider deslizador = new JSlider();
  5.     public Deslizador(){
  6.         super("JSlider");
  7.         setLocationRelativeTo(null);
  8.         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  9.         setLayout(new FlowLayout());
  10.        
  11.         //Configuramos Orientación, mínimo, máximo y valor inicial
  12.         deslizador.setOrientation(SwingConstants.VERTICAL);
  13.         deslizador.setMinimum(25);
  14.         deslizador.setMaximum(75);
  15.         deslizador.setValue(30);
  16.         //Configuramos las marcas grandes cada 5 unidades
  17.         deslizador.setMajorTickSpacing(5);
  18.         //Configuramos las marcas pequeñas cada 1 unidad
  19.         deslizador.setMinorTickSpacing(1);
  20.         //Se muestran los número de las marcas grandes
  21.         deslizador.setPaintLabels(true);
  22.         //Se muestran las marcas pequeñas y grandes
  23.         deslizador.setPaintTicks(true);
  24.         //No se muestra la barra deslizadora
  25.         deslizador.setPaintTrack(false);
  26.        
  27.         add(deslizador);
  28.         pack();
  29.         setVisible(true);
  30.     }
  31.     public static void main(String[] args) {
  32.         new Deslizador();
  33.     }
  34. }

Eventos de Usuario: WindowListener - Adaptadores de Clase

WindowListener

Los eventos de ventana van a ser disparados tanto por contenedores JFrame, Frame y window. Nos informan sobre cambios en las mismas como redimenzionarlos, cerrarlos, abrirlos, minimizar, restaurar, etc. Hay que implementarlos mediante la interface "WindowListener" y agregando el vigilante addWindowListener() a los contenedores, además de los 6 métodos que contiene.


java.awt.event

Interface WindowListener

Métodos:

  • void windowActivated(WindowEvent e)
    • Se invoca cuando la ventana está configurada para ser una ventana activa.
  • void windowClosed(WindowEvent e)
    • Se invoca cuando una ventana se ha cerrado cuando se pulsa en una forma de cierre que la misma contiene.
  • void windowClosing(WindowEvent e)
    • Se invoca cuando el usuario intenta cerrar la ventana desde un método de cierre propio de la ventana.
  • void windowDeactivated(WindowEvent e)
    • Se invoca cuando una ventana ya no está activa.
  • void windowDeiconified(WindowEvent e)
    • Se invoca cuando una ventana se cambia de un minimizado a un estado normal.
  • void windowIconified(WindowEvent e)
    • Se invoca cuando una ventana se cambia de una normal a un estado minimizado.
  • void windowOpened(WindowEvent e)
    • Se invoca la primera vez que una ventana se hace visible.

Class WindowEvent

java.lang.Object
java.util.EventObject
java.awt.AWTEvent
java.awt.event.ComponentEvent
java.awt.event.WindowEvent

Métodos:

entre otros:
  • public int getNewState()
    • Para eventos WINDOW_STATE_CHANGED devuelve un entero que representa el nuevo estado de la ventana. El estado se representa como una máscara de bit a bit.
  • public int getOldState()
    • Para eventos WINDOW_STATE_CHANGED devuelve el estado anterior de la ventana.
  • public Window getOppositeWindow()
    • Devuelve la otra ventana involucrada en este focus o en la activación de cambio.
  • public Window getWindow()
    • Devuelve el creador de este evento.

Ejemplo de los tutoriales de Java

No será de lo más pedagógico del mundo, es decir siempre obtenes el componente o contenedor que genera el evento y lo muestra tal cual en un area de texto cuando realizamos algún cambio, pero bueno aqui esta.


Adaptadores de Clase

Uno de los inconvenientes de implementar interfaces es que hay que poner en nuestro código todos sus métodos de manera obligatoria en especial si queremos implementar sólo un método, los demás podemos dejarlo perfectamente en blanco y funciona. En interfaces como WindowListener que contiene 6 métodos y más aún sí implementamos más de una interface... la labor de meter código basura se vuelve tediosa!.

Por suerte en Java existe los clases llamdas adaptadores de clase para implementar aquellos métodos de las interfaces que nos interese. Estas clases pertenecen a el paquete "java.awt.event" y son los siguientes adaptadores son:

ActionListener sólo cuenta con el método ActionPerformed(ActionEvent e), ItemListener cuenta con itemStateChanged(itemEvent e), TextListener tiene el método textValueChanged(TextEvent) y AdjustmentListener tiene adjustmentValueChanged(AdjustmentEvent e) todos tiene un solo método para lo cual no necesita simplificación, si lo implementas lo usas sin más.

La lógica de este sistema de adaptadores de clase está en que son clases para ser heredadas y hay que recordar que en java la herencia es simple, es decir solo hay una clase padre. Por eso si veniamos heredando de JFrame para hacer nuestras GUIs ahora hay que crear un objeto JFrame para poder usar estos adaptadores.

  • public MiClase extends KeyAdapter

Ahora heredamos estos métodos y solo sobreescribimos el que nos interese, los que no queremos utilizar no podemos nada porque se heredan vacios de la superclase.

Eventos de Usuario: MouseListener y MouseMotionListener

MouseListener

Los eventos de mouse pueden ser generados por cualquier componente añadiendo el vigilante addMouseListener, en general estos eventos son :

  • Click de ratón
  • Entrada del cursor sobre un componente
  • Salida del cursor del mouse sobre un componente

java.awt.event

Interface MouseListener

Métodos:

  • void mousePressed(MouseEvent e)
    • Se invoca cuando el botón del ratón fué pulsado.
  • void mouseReleased(MouseEvent e)
    • Se invoca cuando el botón del ratón fué soltado.
  • void mouseClicked(MouseEvent e)
    • Se invoca cuando el botón del ratón fué pulsado y soltado.
  • void mouseEntered(MouseEvent e)
    • Se invoca cuando el cursor del ratón entró a un componente.
  • void mouseExited(MouseEvent e)
    • Se invoca cuando el cursor del ratón salió de un componente.

Class MouseEvent

java.lang.Object
java.util.EventObject
java.awt.AWTEvent
java.awt.event.ComponentEvent
java.awt.event.InputEvent
java.awt.event.MouseEvent

Métodos:

entre otros:
  • public int getClickCount()
    • Devuelve el número de clicks asociado al evento.
  • public Point getPoint()
    • Devuelve un objeto Point(con coordenas x e y) respecto al componente que generó el evento.
  • public int getX()
    • Devuelve un entero que será la posición horizontal "x" con respecto al componente que generó el evento.
  • public int getY()
    • Devuelve un entero que será la posición vertical "y" con respecto al componente que generó el evento.
  • public int getXOnScreen()
    • Devuelve un entero que será la posición horizontal "x" con respecto a la pantalla.
  • public int getYOnScreen()
    • Devuelve un entero que será la posición vertical "y" con respecto a la pantalla.
  • public Point getLocationOnScreen()
    • Devuelve un objeto Point(con coordenas x e y) con respecto a la pantalla.

MouseMotionListener

Estos eventos de movimiento de mouse tienen lugar cuando el cursor del ratón se mueve sobre un componente. Al igual que antes cualquier componente puede generarlos añadiendo el vigilante addMouseMotionListener().

java.awt.event

Interface MouseMotionListener

Métodos:

  • void mouseDragged(MouseEvent e)
    • Se invoca cuando el botón del ratón fué pulsado sobre un componente y luego se arrastró.
  • void mouseMoved(MouseEvent e)
    • Se invoca cuando el cursor del ratón se ha movido en un componente, pero sin botones han sido pulsados.

Lo objetos Eventos de esta interface sigue siendo "MouseEvent" con sus métodos: getClickCount(), getPoint(), getX(), getY(), etc


AtrapaMouse

El siguiente ejemplo del uso de mouseListener y MouseMotionListener lo tomo de los videos tutoriales de Jesús Conde. Se trata de un pequeño juego de intentar pulsar sobre un botón que se escapa a nuestro cursor del ratón.

  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import javax.swing.*;
  4.  
  5. public class AtrapaMouse extends JFrame implements ActionListener{
  6.     JLabel mensaje = new JLabel("Si puedes...");
  7.     AtrapaPanel atrapa = new AtrapaPanel();
  8.    
  9.     public AtrapaMouse(){
  10.     super("Pulsa en aceptar para cerra la ventana");
  11.     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  12.     setSize(400,200);
  13.     setLocationRelativeTo(null);
  14.     setLayout(new BorderLayout());
  15.     add(BorderLayout.NORTH,mensaje);
  16.     atrapa.aceptar.addActionListener(this);
  17.     add(BorderLayout.CENTER,atrapa);
  18.     setVisible(true);
  19. }
  20.     public void actionPerformed(ActionEvent event){
  21.         System.exit(0);
  22.     }
  23.     public static void main(String[]arguments){
  24.         new AtrapaMouse();
  25.     }
  26.     class AtrapaPanel extends JPanel implements MouseMotionListener{
  27.         JButton aceptar = new JButton("Aceptar");
  28.         int botonX,botonY,ratonX,ratonY;
  29.         int ancho,alto;
  30.        
  31.         AtrapaPanel(){
  32.             super();
  33.             setLayout(null);
  34.             addMouseMotionListener(this);
  35.             botonX = 110; botonY = 110;
  36.             aceptar.setBounds(new Rectangle(botonX,botonY,90,20));
  37.             add(aceptar);
  38.         }
  39.         @Override
  40.         public void mouseMoved(MouseEvent event){
  41.             ratonX = event.getX();
  42.             ratonY = event.getY();
  43.             ancho = (int)getSize().getWidth();
  44.             alto = (int)getSize().getHeight();
  45.            
  46.             if(Math.abs((ratonX 35)- botonX)<50){
  47.                 botonX = moverBoton(ratonX,botonX,ancho);
  48.                 repaint();
  49.             }
  50.             if(Math.abs((ratonY 10)- botonY) <50){
  51.                 botonY = moverBoton(ratonY,botonY,alto);
  52.                 repaint();
  53.             }
  54.         }
  55.        
  56.         public void mouseDragged(MouseEvent event){
  57.             //ignored this event
  58.         }
  59.         private int moverBoton(int ratonAt, int botonAt,int borde){
  60.             if(botonAt < ratonAt){
  61.                 botonAt--;
  62.             } else {
  63.                 botonAt++;
  64.             }
  65.             if (botonAt > (borde - 20)){
  66.                 botonAt = 20;
  67.             }
  68.             if(botonAt < 0){
  69.                 botonAt = borde - 80;
  70.             }
  71.             return botonAt;
  72.         }
  73.        
  74.         public void paintComponent(Graphics comp){
  75.             super.paintComponent(comp);
  76.             aceptar.setBounds(botonX,botonY,90,20);
  77.         }
  78.     }
  79. }

Java 25 de 2025