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. }

Eventos de Usuario: KeyListener

java.awt.event

Interface KeyListener


Métodos:

  • void keyPressed(KeyEvent e)
    • Invocada cuando una tecla fue presionada.
  • void keyReleased(KeyEvent e)
    • Invocada cuando una tecla fue soltada.
  • void keyType(KeyEvent e)
    • Invocada cuando una tecla fue tipeada.

Class KeyEvent

java.lang.Object
java.util.EventObject
java.awt.AWTEvent
java.awt.event.ComponentEvent
java.awt.event.InputEvent
java.awt.event.KeyEvent
 
Desde y otra vez acederemos a un quien genero el evento con getKeyChar() que nos devuelve el caracter de la tecla asociada al evento o devolvera la constante de clase: KeyEvent.CHAR_UNDEFINED.
Para que un componente pueda recibir eventos de tecla es necesario que reciba el foco, los campos de textos, las areas de textos ya cuentan con esta propiedad pero otros componentes también pueden  hacerlo mediante setFocusable(true); 
  1. package eventos;
  2. import java.awt.*;
  3. import java.awt.event.KeyEvent;
  4. import java.awt.event.KeyListener;
  5. import javax.swing.*;
  6. public class Teclas extends JFrame implements KeyListener{
  7.     BorderLayout borde = new BorderLayout();
  8.     JLabel mensaje = new JLabel("Para comenzar pulse una tecla cualquiera:");
  9.    
  10.     JLabel tecla = new JLabel("");
  11.     public Teclas(){
  12.         super("Demostración de KeyListener");
  13.         setSize(350,100);
  14.         setLocationRelativeTo(null);
  15.         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  16.         addKeyListener(this);
  17.         setLayout(borde);
  18.         add(mensaje, BorderLayout.NORTH);
  19.        
  20.         add(tecla, BorderLayout.WEST);
  21.         setVisible(true);
  22.     }
  23.     public static void main(String[] dario){
  24.         new Teclas();
  25.     }
  26.     public void keyTyped(KeyEvent e) {
  27.             tecla.setText("Tecla Pulsada = '" e.getKeyChar() "'");
  28.     }
  29.     public void keyPressed(KeyEvent e) {
  30.        
  31.     }
  32.     public void keyReleased(KeyEvent e) {
  33.        
  34.     }
  35. }



Un pequeño ejemplo de un mini-ahorcado con el uso de KeyListener, es lo suficientemente báscio con un palabra, sin intentos, etc. Hay que notar que el código está escrito para letras minúsculas y no Mayúsculas:
  1. import java.awt.*;
  2. import java.awt.event.KeyEvent;
  3. import java.awt.event.KeyListener;
  4. import javax.swing.*;
  5. public class MiniAhorcado extends JFrame implements KeyListener {
  6.     GridLayout layout = new GridLayout(3,1);
  7.     JLabel bienvenida = new JLabel("Adivina la Palabra:", JLabel.CENTER);
  8.     JPanel panel = new JPanel(new FlowLayout());
  9.     JLabel h = new JLabel("?", JLabel.CENTER);
  10.     JLabel o1 = new JLabel("?", JLabel.CENTER);
  11.     JLabel l = new JLabel("?", JLabel.CENTER);
  12.     JLabel a = new JLabel("?", JLabel.CENTER);
  13.     JLabel m = new JLabel("?", JLabel.CENTER);
  14.     JLabel u = new JLabel("?", JLabel.CENTER);
  15.     JLabel n= new JLabel("?", JLabel.CENTER);
  16.     JLabel d = new JLabel("?", JLabel.CENTER);
  17.     JLabel o2 = new JLabel("?", JLabel.CENTER);
  18.     JLabel tecla = new JLabel("", JLabel.CENTER);
  19.     char[] palabras = {'h','o','l','a'};
  20.     public MiniAhorcado(){
  21.         super("Bienvenidos al juego del ahorcado");
  22.         setSize(380,110);
  23.         setLocationRelativeTo(null);
  24.         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  25.         setLayout(layout);
  26.         add(bienvenida);
  27.         panel.add(h);panel.add(o1);panel.add(l);panel.add(a);
  28.         panel.add(m);panel.add(u);panel.add(n);panel.add(d);panel.add(o2);
  29.         add(panel);
  30.         add(tecla);
  31.         addKeyListener(this);
  32.         setVisible(true);
  33.     }
  34.    
  35.     public void keyTyped(KeyEvent e) {
  36.         char caracter = e.getKeyChar();
  37.         tecla.setText("Tecla Pulsada = '" caracter "'");
  38.         adivina(caracter);
  39.     }
  40.     public void keyPressed(KeyEvent e) {}
  41.     public void keyReleased(KeyEvent e) {}
  42.     public static void main(String[] args) {
  43.         new MiniAhorcado();
  44.     }
  45.     public void adivina(char c){
  46.         switch(c){
  47.         case 'h':
  48.             h.setText("H");
  49.             break;
  50.         case 'o':
  51.             o1.setText("O");
  52.             o2.setText("O");
  53.             break;
  54.         case 'l':
  55.             l.setText("L");
  56.             break;
  57.         case 'a':
  58.             a.setText("A ");
  59.             break;
  60.         case 'm':
  61.             m.setText(" M");
  62.             break;
  63.         case 'u':
  64.             u.setText("U");
  65.             break;
  66.         case 'n':
  67.             n.setText("N");
  68.             break;
  69.         case 'd':
  70.             d.setText("D");
  71.             break;
  72.         }
  73.     }
  74. }