Foros del Web » Programación para mayores de 30 ;) » Java »

Obtener componente foco activado

Estas en el tema de Obtener componente foco activado en el foro de Java en Foros del Web. Para mi programita en Netbeans: Al presionar un botón, ¿cómo puedo obtener el JTextfield que tiene el foco activado?...
  #1 (permalink)  
Antiguo 13/04/2009, 14:43
 
Fecha de Ingreso: febrero-2008
Ubicación: Madrid
Mensajes: 474
Antigüedad: 16 años, 3 meses
Puntos: 1
Exclamación Obtener componente foco activado

Para mi programita en Netbeans:

Al presionar un botón, ¿cómo puedo obtener el JTextfield que tiene el foco activado?
  #2 (permalink)  
Antiguo 13/04/2009, 21:57
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: Obtener componente foco activado

Hola:

Prueba con

Componente unComponente = FocusManager.getCurrentManager().getFocusOwner();

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 14/04/2009, 01:13
 
Fecha de Ingreso: febrero-2008
Ubicación: Madrid
Mensajes: 474
Antigüedad: 16 años, 3 meses
Puntos: 1
Respuesta: Obtener componente foco activado

Cita:
Iniciado por chuidiang Ver Mensaje
Hola:

Prueba con

Component unComponente = FocusManager.getCurrentManager().getFocusOwner();

Se bueno.
Cuando llegue del curro lo pruebo, tengo que hacer un cast?

Componente (JTexfield)unComponente = FocusManager.getCurrentManager().getFocusOwner();

O lo puedo hacer directamente?


JTextField unComponente = FocusManager.getCurrentManager().getFocusOwner();

Muchas gracias.

Última edición por jorgegetafe; 14/04/2009 a las 02:39
  #4 (permalink)  
Antiguo 14/04/2009, 03:25
 
Fecha de Ingreso: febrero-2008
Ubicación: Madrid
Mensajes: 474
Antigüedad: 16 años, 3 meses
Puntos: 1
Exclamación Respuesta: Obtener componente foco activado

Tengo algunos problemas, he probado varias cosas y siempre con errores:


Primer intento (ERROR: Exception occurred during event dispatching:
java.lang.NullPointerException
):

Código:
Component componente =  FocusManager.getCurrentManager().getFocusOwner();
        if (componente.getName().equals("textTitulo"))
                JOptionPane.showMessageDialog(this, "Titulo tiene el foco");

Segundo intento (ERROR: Tipos incompatibles):

Código:
if (FocusManager.getCurrentManager().getFocusOwner()).getName().equals(textTitulo.getName());
JOptionPane.showMessageDialog(this, "Titulo tiene el foco");

Tercer intento (ERROR en tiempo de compilación: is abstract, cannot be instantiated )

Código:
Component componente = new Component();
        componente = FocusManager.getCurrentManager().getFocusOwner();
        if (componente.getName().equals("textTitulo"))
                JOptionPane.showMessageDialog(this, "Titulo tiene el foco");

Quinto intento: He intentado hacer un cast, para pasar el componente a jtextfield y en tiempo de ejecución me da error de casting.


Necesito saber en que JTextfield está el foco para hacer unas cosas u otras... ayuda!!!

Muchas gracias.

Última edición por jorgegetafe; 14/04/2009 a las 03:34
  #5 (permalink)  
Antiguo 14/04/2009, 15:10
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: Obtener componente foco activado

Hola:

Revisa lo que has hecho en tus intentos. El primero y segundo son exactamente iguales (salvo que guardas component en una variable local intermedia o no), así que si te da errores distintos, es porque hay algo ajeno a este código que cambia.

En el tercer intento, no se puede hacer new Component() y no hace falta hacerlo.

En el último, si da error de casting, es que no es un JTextField.

Intenta hacer el código, pero comprobando cosas que puedan fallar

- Si FocusManager.getCurrentManager().getFocusOwner() devuelve null, no hay que seguir haciendo más (ni mucho menos llamar a getName()).
- Si no devuelve null, comprueba con un intanceof si es un JTextField y en ese caso, haz el cast.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #6 (permalink)  
Antiguo 15/04/2009, 02:58
 
Fecha de Ingreso: febrero-2008
Ubicación: Madrid
Mensajes: 474
Antigüedad: 16 años, 3 meses
Puntos: 1
Exclamación Respuesta: Obtener componente foco activado

He hecho lo que me has dicho y cada vez entiendo menos el tema, ejecuto el siguiente código:

Código:
private void copiarActionPerformed(java.awt.event.ActionEvent evt) {                                       
      try{
          if ( (FocusManager.getCurrentManager().getFocusOwner() ) == null )
              JOptionPane.showMessageDialog(null, "Da == a null");
          else{
              if ( (FocusManager.getCurrentManager().getFocusOwner() ) instanceof TextField)
                  JOptionPane.showMessageDialog(null, "!= de null e igual a JTextfield");
              else
                  JOptionPane.showMessageDialog(null, (FocusManager.getCurrentManager().getFocusOwner() ).getClass().toString());
          }
      }
      catch(Exception e){
      JOptionPane.showMessageDialog(null, e.getMessage());
      }
Y me dice: "class javax.swing.JRootPane". Por dios no se ni lo que es un JRootPane!!! si el foco (¿palito que parpadea no?) está dentro de un JTextField (lo he mirado por si acaso: boton derecho propiedades y aparece: "propiedades de textTitulo [JTextField]")

Ayudadme porfa, gracias.

Última edición por jorgegetafe; 15/04/2009 a las 02:59 Razón: Errata
  #7 (permalink)  
Antiguo 15/04/2009, 11:49
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: Obtener componente foco activado

Hola:

He estado probando y el método que te he dicho a mí me da el botón (cosa lógica, al pulsarlo el JTextField pierde el foco y lo gana el botón).

Código:
package com.chuidiang.prueba;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.FocusManager;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class Prueba {

    /**
     * @param args
     */
    public static void main(String[] args) {
        JFrame v = new JFrame();
        JTextField tf = new JTextField(10);
        JButton b = new JButton("pulsa");
        v.getContentPane().setLayout(new FlowLayout());
        v.getContentPane().add(tf);
        v.getContentPane().add(b);
        v.pack();
        v.setLocationRelativeTo(null);
        v.setVisible(true);
        v.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        b.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println(FocusManager.getCurrentManager()
                        .getFocusOwner());

            }
        });
    }

}
El siguiente trozo de código

Código:
        Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {

            @Override
            public void eventDispatched(AWTEvent event) {
                if (event instanceof FocusEvent) {
                    if (((FocusEvent) event).getID() == FocusEvent.FOCUS_LOST) {
                        System.out.println(((FocusEvent) event).getComponent());
                    }
                }
            }
        }, AWTEvent.FOCUS_EVENT_MASK);
va recibiendo los componentes que pierden el foco. Con algo como eso puedes guardar en algún sitio cual es el último JTextField que pierde el foco y usarlo en el botón. No me gusta la solución (parece muy rebuscada).

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #8 (permalink)  
Antiguo 15/04/2009, 12:54
 
Fecha de Ingreso: febrero-2008
Ubicación: Madrid
Mensajes: 474
Antigüedad: 16 años, 3 meses
Puntos: 1
Respuesta: Obtener componente foco activado

Lo pruebo cuando pueda y te cuento, muchas gracias.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:58.