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的内容),并没有违反任何编程标准。它允许以简单而直接的方式按名称访问组件
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
如果您计划在运行时在任何时候添加、删除或重命名组件,我会考虑根据您的更改添加HASMAP的方法。
< P>我知道这是一个老问题,但我发现我自己刚才在问它。我想要一个简单的方法来获得组件的名称,所以我不必编写一些卷积代码每TI。允许我访问不同的组件。例如,让JButton访问文本字段中的文本或列表中的选择 最简单的解决方案是将所有组件变量都设置为类变量,这样您就可以在任何地方访问它们。然而,并不是每个人都想这样做,有些人(比如我)正在使用GUI编辑器,这些编辑器不会将组件生成为类变量 我想,我的解决方案很简单,而且据我所知(参考fortran的内容),并没有违反任何编程标准。它允许以简单而直接的方式按名称访问组件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
如果您计划在运行时在任何时候添加、删除或重命名组件,我将考虑根据您的更改添加修改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;
}