Java 按名称获取Swing组件

Java 按名称获取Swing组件,java,swing,jframe,Java,Swing,Jframe,我在JFrame中有一些我想要的组件 参考另一个JFrame,我想要 通过名字而不是 对每种方法都执行公共获取/设置方法 从Swing有没有一种方法可以像do一样通过其名称获取组件引用 c# e、 g.form.Controls[“text”] 谢谢您可以将一个变量声明为公共变量,然后获取文本或任何您想要的操作,然后您可以在另一个框架中访问它(如果它在同一个包中),因为它是公共的。您可以将一个变量声明为公共变量,然后获取文本或任何您想要的操作,然后您可以在另一个框架中访问它(如果它在同一个包中)

我在
JFrame
中有一些我想要的组件 参考另一个
JFrame
,我想要 通过名字而不是 对每种方法都执行公共获取/设置方法

从Swing有没有一种方法可以像do一样通过其名称获取组件引用 c#

e、 g.
form.Controls[“text”]


谢谢

您可以将一个变量声明为公共变量,然后获取文本或任何您想要的操作,然后您可以在另一个框架中访问它(如果它在同一个包中),因为它是公共的。

您可以将一个变量声明为公共变量,然后获取文本或任何您想要的操作,然后您可以在另一个框架中访问它(如果它在同一个包中)因为它是公共的。

您可以在第二个JFrame中保留对第一个JFrame的引用,然后循环通过JFrame.getComponents(),检查每个元素的名称。

您可以在第二个JFrame中保留对第一个JFrame的引用,然后循环通过JFrame.getComponents(),检查每个元素的名称。

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

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

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

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

我想,我的解决方案很简单,而且据我所知(参考fortran的内容),并没有违反任何编程标准。它允许以简单而直接的方式按名称访问组件

  • 创建映射类变量。您需要在 至少,为了简单起见,我把我的组件命名为Map

    private HashMap componentMap;
    
  • 将所有组件正常添加到框架中

    initialize() {
        //add your components and be sure
        //to name them.
        ...
        //after adding all the components,
        //call this method we're about to create.
        createComponentMap();
    }
    
  • 在类中定义以下两个方法。如果尚未导入组件,则需要导入组件:

    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;
    }
    
    private void createComponentMap(){
    componentMap=新的HashMap();
    Component[]components=yourForm.getContentPane().getComponents();
    对于(int i=0;i
  • 现在您有了一个HashMap,它将框架/内容窗格/面板/等中当前存在的所有组件映射到它们各自的名称

  • 现在要访问这些组件,只需调用getComponentByName(字符串名称)。如果存在具有该名称的组件,它将返回该组件。如果不存在,它将返回null。您有责任将组件强制转换为正确的类型。我建议使用instanceof来确保


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

    < P>我知道这是一个老问题,但我发现我自己刚才在问它。我想要一个简单的方法来获得组件的名称,所以我不必编写一些卷积代码每TI。允许我访问不同的组件。例如,让JButton访问文本字段中的文本或列表中的选择

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

    我想,我的解决方案很简单,而且据我所知(参考fortran的内容),并没有违反任何编程标准。它允许以简单而直接的方式按名称访问组件

  • 创建映射类变量。您需要在 至少,为了简单起见,我把我的组件命名为Map

    private HashMap componentMap;
    
  • 将所有组件正常添加到框架中

    initialize() {
        //add your components and be sure
        //to name them.
        ...
        //after adding all the components,
        //call this method we're about to create.
        createComponentMap();
    }
    
  • 在类中定义以下两个方法。如果尚未导入组件,则需要导入组件:

    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;
    }
    
    private void createComponentMap(){
    componentMap=新的HashMap();
    Component[]components=yourForm.getContentPane().getComponents();
    对于(int i=0;i
  • 现在您有了一个HashMap,它将框架/内容窗格/面板/等中当前存在的所有组件映射到它们各自的名称

  • 现在要访问这些组件,只需调用getComponentByName(字符串名称)。如果存在具有该名称的组件,它将返回该组件。如果不存在,它将返回null。您有责任将组件强制转换为正确的类型。我建议使用instanceof来确保

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

    GETCuffeTnBame(框架,名称)< /P> 如果您使用的是NetBeans或另一个默认创建私有变量的IDE

    // 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
    }
    
    private void createComponentMap() {
        componentMap = new HashMap<String,Component>();
        List<Component> components = getAllComponents(this);
        for (Component comp : components) {
            componentMap.put(comp.getName(), comp);
        }
    }
    
    private 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;
    }
    
    public Component getComponentByName(String name) {
        if (componentMap.containsKey(name)) {
            return (Component) componentMap.get(name);
        }
        else return null;
    }
    
    public class TheDigitalClock {
    
        private static ClockLabel timeLable = new ClockLabel("timeH");
        private static ClockLabel timeLable2 = new ClockLabel("timeM");
        private static ClockLabel timeLable3 = new ClockLabel("timeAP");
    
    
        ...
        ...
        ...
    
    
                public void actionPerformed(ActionEvent e)
                {
                    ...
                    ...
                    ...
                        //set all components transparent
                         TheDigitalClock.timeLable.setBorder(null);
                         TheDigitalClock.timeLable.setOpaque(false);
                         TheDigitalClock.timeLable.repaint();
    
                         ...
                         ...
                         ...
    
                    }
        ...
        ...
        ...
    }
    
    /**
     * Description          : Find a component having the given name in container  desccendants hierarchy
     * Assumptions          : First component with the given name is returned
     * @return java.awt.Component
     * @param component java.awt.Component
     * @param componentName java.lang.String
     */
    public static Component findComponentByName(Component component, String componentName) {
      if (component == null ) {
        return null;
      }
    
      if (component.getName() != null && component.getName().equalsIgnoreCase(componentName)) {
        return component;
      } 
    
      if ( (component instanceof Container )  ) {       
        Component[] children = ((Container) component).getComponents();
        for ( int i=0; i<children.length; i++ ) {
            Component child = children[i];
            Component found = findComponentByName( child, componentName );
            if (found != null ) {
                return found;
            }
        }
      }
      return null;
    }