Как получить имя компонента GUI в Java? - PullRequest
1 голос
/ 16 марта 2012

Мне нужно иметь список компонентов в классе и имя соответствующей переменной. Мне удалось получить список всех компонентов в графическом интерфейсе. Однако когда я вызываю метод getName для компонента, возвращается ноль. Кто-нибудь знает, как можно получить такое название для компонента, пожалуйста?

Это код на данный момент:

public static void main(String[] args){
    Calculator c = new Calculator();

    List<Component> containers = getAllComponents(c.getContentPane());
    for (int i = 0; i < containers.size(); i++) {
        System.out.println(containers.get(i).getClass().getName());
        System.out.println(containers.get(i).getName());
    }
    System.exit(0);
}

public static List<Component> getAllComponents(final Container c) {
    Component[] comps = c.getComponents();
    List<Component> compList = new ArrayList<Component>();
    for (Component comp : comps) {
        compList.add(comp);
        if (comp instanceof Container) {
            compList.addAll(getAllComponents((Container) comp));
        }
    }
    return compList;
}

Ответы [ 3 ]

1 голос
/ 16 марта 2012

getName() вернет значение только в том случае, если вы ранее вызывали setName().Но это имя произвольно.Это средство отладки для разработчиков пользовательского интерфейса.

Мне кажется, вы хотите знать, какой компонент находится в каком поле класса Calculator.Для этого вам нужно использовать Reflection API .

Try Calculator.class.getDeclaredFields().Чтобы прочитать значение частного поля, см. этот пример кода .

1 голос
/ 16 марта 2012

Метод getName() для компонентов не гарантирует возврата значения и, конечно, не возвращает имя переменной, которой был назначен компонент.Также обратите внимание, что несколько переменных могут указывать на один и тот же экземпляр объекта, поэтому информация будет менее полезной, даже если она будет доступна.

0 голосов
/ 16 марта 2012

Каждый компонент может иметь имя, доступ к которому осуществляется через getName () и setName (), но вам придется написать собственную функцию поиска.

Вы также можете попробовать с HashMap. Я нахожу пример с этим.

    Create a Map class variable. You'll need to import HashMap at the very least. I named mine componentMap for simplicity.

private HashMap componentMap;

    Add all of your components to the frame as normal.

initialize() {
    //add your components and be sure
    //to name them.
    ...
    //after adding all the components,
    //call this method we're about to create.
    createComponentMap();
}

    Define the following two methods in your class. You'll need to import Component if you haven't already:

private void createComponentMap() {
        componentMap = new HashMap<String,Component>();
        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;
}

    Now you've got a HashMap that maps all the currently existing components in your frame/content pane/panel/etc to their respective names.

    To now access these components, it is as simple as a call to getComponentByName(String name). If a component with that name exists, it will return that component. If not, it returns null. It is your responsibility to cast the component to the proper type. I suggest using instanceof to be sure.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...