按名称获取 Swing 组件

2022-09-02 19:35:25

我有一些组件,我想引用到另一个组件中,我想通过名称获取它们,而不是为每个组件做公共的获取/设置方法。JFrameJFrame

有没有办法从 Swing 获得一个组件引用,比如 do c#?

例如:form.Controls["text"]

谢谢


答案 1

我知道这是一个老问题,但我发现自己刚才问了这个问题。我想要一种按名称获取组件的简单方法,这样我就不必每次都编写一些复杂的代码来访问不同的组件。例如,让 JButton 访问文本字段中的文本或 List 中的选定内容。

最简单的解决方案是使所有组件变量都是类变量,以便您可以在任何地方访问它们。但是,并非每个人都想这样做,有些人(如我自己)正在使用GUI编辑器,这些编辑器不会将组件生成为类变量。

我的解决方案很简单,我想,据我所知,并没有真正违反任何编程标准(参考fortran得到的东西)。它允许以一种简单直接的方式按名称访问组件。

  1. 创建地图类变量。您至少需要导入HashMap。为了简单起见,我命名为mine componentMap。

    private HashMap componentMap;
    
  2. 像往常一样将所有组件添加到框架中。

    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. 在类中定义以下两个方法。如果您尚未导入组件,则需要导入:

    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;
    }
    
  4. 现在,您已经有了一个HashMap,它将框架/内容窗格/面板/等中的所有当前存在的组件映射到它们各自的名称。

  5. 现在要访问这些组件,就像调用getComponentByName(字符串名称)一样简单。如果存在具有该名称的组件,它将返回该组件。如果不是,则返回 null。您有责任将组件强制转换为正确的类型。我建议使用实例来确保。

如果您计划在运行时的任何时候添加、删除或重命名组件,我会考虑添加根据您的更改修改 HashMap 的方法。


答案 2

每个组件都可以有一个名称,可通过 和 访问,但您必须编写自己的查找函数。getName()setName()


推荐