FocusListener
El foco describe el componente que esta activo para entradas de teclado.
Este puede ser ganado o perdido, y esto representa también un evento de usuario. La idea se me hace similar a
el reflector llamado vector que recibe a un presentador y como si fuera un componente que recibe esa atención.
java.awt.event
Interface FocusListener
Métodos:
- void focusGained(FocusEvent e)
- Se invoca cuando un componente gana el foco del teclado.
- void focusLost(FocusEvent e)
- Se invoca cuando un componente pierde el foco del teclado.
Pequeño ejemplo: al seleccionar(ganar el foco) un campo de texto aparece un mensaje
con una sugerencia y al perderlo este se borra:
- import java.awt.*;
- import java.awt.event.FocusEvent;
- import java.awt.event.FocusListener;
- import javax.swing.*;
- public EjemploFoco(){
- super("EJemplo de FocusListener");
- setSize(470,140);
- setLocationRelativeTo(null);
- panel.setLayout(flujo);
- panel.add(nombre);
- campo.addFocusListener(this);
- panel.add(campo);
- panel.add(mensaje);
- panel2.setLayout(flujo);
- panel2.add(apellido);
- campo2.addFocusListener(this);
- panel2.add(campo2);
- panel2.add(mensaje2);
- setLayout(grilla);
- add(panel);add(panel2);
- //pack();
- setVisible(true);
- }
- @Override
- if(e.getSource() == campo){
- mensaje.setText("<--Escribe tu monbre.");
- }
- if(e.getSource() == campo2){
- mensaje2.setText("<--Escribe tu Apellido.");
- }
- }
- @Override
- if(e.getSource() == campo){
- mensaje.setText(" ");
- }
- if(e.getSource() == campo2){
- mensaje2.setText(" ");
- }
- }
- new EjemploFoco();
- }
- }
ComponentEvent, FocusEvent y métodos propios
Class ComponentEvent
java.lang.Object
java.util.EventObject
java.awt.AWTEvent
javax.swing.JComponent
java.awt.event.ComponentEvent
java.util.EventObject
java.awt.AWTEvent
javax.swing.JComponent
java.awt.event.ComponentEvent
Class FocusEvent
java.lang.Object
java.util.EventObject
java.awt.AWTEvent
javax.swing.JComponent
java.awt.event.ComponentEvent
java.awt.event.FocusEvent
java.util.EventObject
java.awt.AWTEvent
javax.swing.JComponent
java.awt.event.ComponentEvent
java.awt.event.FocusEvent
Lo que nos interesa de estas clases es el objeto FocusEvent e que indicamos como parametro
en los métodos implementados por la interface FocusListener.
- public void focusGained(FocusEvent e) {}
- public void focusGLost(FocusEvent e) {}
Y en particular sus métodos:
- Class ComponentEvent
- getComponent()
- Devuelve el componente que generó el evento.
- getComponent()
- Class FocusEvent
- getOppositeComponent()
- Devuelve el componente implicado en este cambio de enfoque, que perdio el foco.
- getOppositeComponent()
- isTemporary()
- Devuelve un parámetro String, que identifica a este evento.
- requestFocus()
- Podemos pedir que tenga el foco un componente como JButton.
Segundo Ejemplo
- import java.awt.*;
- import java.awt.event.FocusEvent;
- import java.awt.event.FocusListener;
- import javax.swing.*;
- public CalculadoraFoco(){
- super("Calculadora a través de FocusListener");
- setLocationRelativeTo(null);
- setLayout(flujo);
- num1.addFocusListener(this);
- add(num1); add(mas);
- num2.addFocusListener(this);
- add(num2); add(igual);
- resultado.setEnabled(false);
- add(resultado);
- pack();
- setVisible(true);
- }
- @Override
- try{
- resultado.setText(" " total);
- num1.setText("0");
- num2.setText("0");
- resultado.setText("0");
- }
- }
- @Override
- focusGained(e);
- }
- new CalculadoraFoco();
- }
- }
Una pequeña calculadora que al ganar o perder el foco en nuestros JtextField se calcula
el resultado de la suma automaticamente al pasar por otro campo de texto. Tambien podemos usar "tab" para pasar al siguiente
y "shift+tab" para regresar.
Nuestros campos de textos regresan un String que lo pasamos a Float con el método parseFloat y como parametro recuperamos el texto ingresado. Como también podemos escribir una letra u otro caracter incorrecto se puede producir una excepción maneja por NumberFormatException y en ese caso reseteamos todos los valores a "0".
Nuestros campos de textos regresan un String que lo pasamos a Float con el método parseFloat y como parametro recuperamos el texto ingresado. Como también podemos escribir una letra u otro caracter incorrecto se puede producir una excepción maneja por NumberFormatException y en ese caso reseteamos todos los valores a "0".
Ejemplo de The Java™ Tutorials
El desafio recrear algo similar a lo propuesto en
los tutoriales oficiales de Java
El código es el siguiente:
- package eventos;
- import java.util.Vector;
- import java.awt.*;
- import java.awt.event.*;
- import javax.swing.*;
- final int numItems = 15;
- JTextArea mostrar;
- //Constructor que configura el titulo cuando lo llamen.
- super(nombreTitulo);
- }
- pane.setLayout(grilla);
- c.weightx = 1.0; //Hace la columna lo más ancho posible.
- campoTexto.addFocusListener(this);
- grilla.setConstraints(campoTexto, c);
- add(campoTexto);
- c.weightx = 0.1; //Ensancha un poco cualquier otra columna.
- etiqueta.addFocusListener(this);
- grilla.setConstraints(etiqueta, c);
- add(etiqueta);
- Vector<String> vector = new Vector<String>(numItems);
- for (int i = 0; i < numItems; i++)
- vector.addElement(prefijoCombo i);
- JComboBox<String> comboBox = new JComboBox<String>(vector);
- comboBox.addFocusListener(this);
- grilla.setConstraints(comboBox, c);
- add(comboBox);
- boton.addFocusListener(this);
- grilla.setConstraints(boton, c);
- add(boton);
- c.weightx = 0.0;
- c.weighty = 0.1;
- Vector<String> listaVector = new Vector<String>(numItems);
- for (int i = 0; i < numItems; i++) {
- listaVector.addElement(prefijoLista i);
- }
- JList<String> lista = new JList<String>(listaVector);
- lista.setSelectedIndex(1); //Es más fácil ver el cambio de enfoque, si se selecciona un elemento.
- lista.addFocusListener(this);
- grilla.setConstraints(scrollPaneLista, c);
- add(scrollPaneLista);
- c.weighty = 1.0; //Hace esta fila tan alto como sea posible.
- mostrar.setEditable(false);
- //El método setRequestFocusEnabled impide que un componente de ser seleccionable
- //pero todavía puede obtener el enfoque a través del teclado, probar con "tab"
- mostrar.setRequestFocusEnabled(false);
- mostrar.addFocusListener(this);
- grilla.setConstraints(scrollPaneArea, c);
- add(scrollPaneArea);
- }
- //Métodos de la interface FocusListener
- mostrarMensaje("Foco ganado", e);
- }
- mostrarMensaje("Foco perdido", e);
- }
- mostrar.append(prefijo (e.isTemporary() ? " (temporary):" : ":") );
- mostrar.append(e.getComponent().getClass().getName() );
- mostrar.append("; Componente Anterior: " (e.getOppositeComponent() != null ? e.getOppositeComponent().getClass().getName() : "ninguno") );
- mostrar.append( newline);
- mostrar.setCaretPosition(mostrar.getDocument().getLength());
- }
- // Crear la GUI y la muestra. Para la seguridad del hilo, este método debe ser invocado desde el
- // el hilo de distribución de eventos.
- private static void crearYMostrarGUI() {
- //Crear y da la configuracion básica de la ventana.
- FocusEventDemo marco = new FocusEventDemo("Demostración de FocusListener");
- //Configura el contenido del panel con el método "agregarComponentesPanel(final Container pane).
- marco.agregarComponentesPanel(marco.getContentPane());
- //Enpaquetamos y hacemos visible la ventana.
- marco.pack();
- marco.setVisible(true);
- }
- /* Podemos elegir alguno de los Look and Feel comentando el otro. */
- try {
- //UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
- ex.printStackTrace();
- ex.printStackTrace();
- ex.printStackTrace();
- ex.printStackTrace();
- }
- //Programa una tarea para el hilo de distribución de eventos:
- //La interfaz Runnable y el método run que llama a nuestro método.
- public void run() {
- crearYMostrarGUI();
- }
- });
- }
- }
Mi resultado:
No hay comentarios:
Publicar un comentario