Saltar al contenido

Obtener un componente Swing por nombre

Nuestro team de redactores ha estado horas buscando para dar espuestas a tus interrogantes, te regalamos la respuestas y deseamos servirte de mucha ayuda.

Solución:

Sé que esta es una vieja pregunta, pero me encontré haciéndola justo ahora. Quería una manera fácil de obtener componentes por nombre para no tener que escribir un código intrincado cada vez para acceder a diferentes componentes. Por ejemplo, tener un JButton para acceder al texto en un campo de texto o una selección en una Lista.

La solución más fácil es hacer que todas las variables de los componentes sean variables de clase para que pueda acceder a ellas desde cualquier lugar. Sin embargo, no todos quieren hacer eso, y algunos (como yo) están usando editores GUI que no generan los componentes como variables de clase.

Mi solución es simple, me gustaría pensar, y realmente no viola ningún estándar de programación, hasta donde yo sé (haciendo referencia a lo que fortran estaba tratando). Permite una manera fácil y directa de acceder a los componentes por nombre.

  1. Cree una variable de clase de mapa. Deberá importar HashMap como mínimo. Llamé al mío componentMap por simplicidad.

    private HashMap componentMap;
    
  2. Agregue todos sus componentes al marco como de costumbre.

    initialize() 
        //add your components and be sure
        //to name them.
        ...
        //after adding all the components,
        //call this method we're about to create.
        createComponentMap();
    
    
  3. Defina los siguientes dos métodos en su clase. Deberá importar el componente si aún no lo ha hecho:

    private void createComponentMap() 
            componentMap = new HashMap();
            Component[] components = yourForm.getContentPane().getComponents();
            for (int i=0; i < components.length; i++) 
                    componentMap.put(components[i].getName(), components[i]);
            
    
    
    public Component getComponentByName(String name) 
            if (componentMap.containsKey(name)) 
                    return (Component) componentMap.get(name);
            
            else return null;
    
    
  4. Ahora tiene un HashMap que asigna todos los componentes existentes actualmente en su marco/panel de contenido/panel/etc a sus respectivos nombres.

  5. Para acceder ahora a estos componentes, es tan simple como llamar a getComponentByName(String name). Si existe un componente con ese nombre, devolverá ese componente. Si no, vuelve null. Es su responsabilidad moldear el componente al tipo adecuado. Sugiero usar instanceof para estar seguro.

Si planea agregar, eliminar o cambiar el nombre de los componentes en cualquier momento durante el tiempo de ejecución, consideraría agregar métodos que modifiquen HashMap de acuerdo con sus cambios.

Cada Component puede tener un nombre, se accede a través de getName() y setName()pero tendrá que escribir su propia función de búsqueda.

getComponentByName(marco, nombre)

SI está utilizando NetBeans u otro IDE que por defecto crea variables privadas (campos) para contener todos sus componentes AWT/Swing, entonces el siguiente código puede funcionar para usted. Utilizar de la siguiente manera:

// get a button (or other component) by name
JButton button = Awt1.getComponentByName(someOtherFrame, "jButton1");

// do something useful with it (like toggle it's enabled state)
button.setEnabled(!button.isEnabled());

Aquí está el código para hacer posible lo anterior...

import java.awt.Component;
import java.awt.Window;
import java.lang.reflect.Field;

/**
 * additional utilities for working with AWT/Swing.
 * this is a single method for demo purposes.
 * recommended to be combined into a single class
 * module with other similar methods,
 * e.g. MySwingUtilities
 * 
 * @author http://javajon.blogspot.com/2013/07/java-awtswing-getcomponentbynamewindow.html
 */
public class Awt1 

    /**
     * attempts to retrieve a component from a JFrame or JDialog using the name
     * of the private variable that NetBeans (or other IDE) created to refer to
     * it in code.
     * @param  Generics allow easier casting from the calling side.
     * @param window JFrame or JDialog containing component
     * @param name name of the private field variable, case sensitive
     * @return null if no match, otherwise a component.
     */
    @SuppressWarnings("unchecked")
    static public  T getComponentByName(Window window, String name) 

        // loop through all of the class fields on that form
        for (Field field : window.getClass().getDeclaredFields())  IllegalArgumentException 
                    

        // no match found
        return null;
    


Utiliza la reflexión para mirar a través de los campos de clase para ver si puede encontrar un componente al que hace referencia una variable del mismo nombre.

NOTA: El código anterior usa genéricos para convertir los resultados en cualquier tipo que esté esperando, por lo que en algunos casos es posible que deba ser explícito acerca de la conversión de tipos. por ejemplo si myOverloadedMethod acepta ambos JButton y JTextFieldes posible que deba definir explícitamente la sobrecarga que desea llamar ...

myOverloadedMethod((JButton) Awt1.getComponentByName(someOtherFrame, "jButton1"));

Y si no está seguro, puede obtener un Component y compruébalo con instanceof...

// get a component and make sure it's a JButton before using it
Component component = Awt1.getComponentByName(someOtherFrame, "jButton1");
if (component instanceof JButton) 
    JButton button = (JButton) component;
    // do more stuff here with button

¡Espero que esto ayude!

valoraciones y reseñas

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *