我在 JFrame
中有一些我想要的组件
引用另一个 JFrame
我想要
通过名字而不是
为每个方法执行公共(public)获取/设置方法。
有没有一种方法可以从 Swing 中通过名称获取组件引用,比如 do C#?
例如form.Controls["text"]
谢谢
最佳答案
我知道这是一个老问题,但我发现自己刚刚问了这个问题。我想要一种简单的方法来按名称获取组件,这样我就不必每次都编写一些复杂的代码来访问不同的组件。例如,让 JButton 访问文本字段中的文本或列表中的选择。
最简单的解决方案是将所有组件变量设为类变量,以便您可以在任何地方访问它们。然而,并不是每个人都想这样做,有些人(比如我自己)正在使用不将组件生成为类变量的 GUI 编辑器。
我想我的解决方案很简单,而且据我所知并没有真正违反任何编程标准(引用 Fortran 的目标)。它提供了一种简单直接的方法来按名称访问组件。
创建一个 Map 类变量。您需要在 非常少。为简单起见,我将我的组件命名为 componentMap。
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; }
现在您已经有了一个 HashMap,它将框架/内容 Pane /面板/等中所有当前存在的组件映射到它们各自的名称。
现在要访问这些组件,就像调用 getComponentByName(String name) 一样简单。如果存在具有该名称的组件,它将返回该组件。如果不是,则返回 null。您有责任将组件转换为正确的类型。我建议使用 instanceof 来确定。
如果您计划在运行时的任何时候添加、删除或重命名组件,我会考虑添加根据您的更改修改 HashMap 的方法。
关于java - 按名称获取 Swing 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4958600/