我有一个代码(摇摆):
javax.swing.JButton loginbutton = new javax.swing.JButton("Login");
loginbutton.setName("LoginButton126");
并测试它:
ComponentFinder finder = BasicComponentFinder.finderWithCurrentAwtHierarchy();
javax.swing.JButton loginbutton = (javax.swing.JButton) finder.findByName("LoginButton126");
但不幸的是我有:
Exception in thread "main" java.lang.NoClassDefFoundError: org/fest/util/Strings
我应该改变什么?
祝你好运
答案 0 :(得分:0)
我认为这应该可以正常使用
创建一个只能访问其后创建的GUI组件的新ComponentFinder。在以下示例中,finder可以访问MainFrame,但不能访问LoginFrame。
// new LoginFrame();
ComponentFinder finder = BasicComponentFinder.finderWithNewAwtHierarchy();
finder.findByName("login", true); // will fail finding component of login frame
// new MainFrame();
finder.findByName("pw", true); // will work finding label of main frame
答案 1 :(得分:0)
最简单的解决方案是使所有组件变量成为类变量,以便您可以在任何地方访问它们。然而,不是每个人都想这样做,有些人(比如我自己)正在使用GUI编辑器,这些编辑器不会将组件生成为类变量。
我的解决方案很简单,我想要思考,并且并没有真正违反任何编程标准,据我所知(参考fortran的内容)。它允许以简单直接的方式按名称访问组件。
创建Map类变量。您至少需要导入HashMap。为简单起见,我将我的命名为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,它将您的框架/内容窗格/面板/等中的所有当前现有组件映射到它们各自的名称。
现在要访问这些组件,就像调用getComponentByName(String name)一样简单。如果存在具有该名称的组件,则它将返回该组件。如果不是,则返回null。您有责任将组件转换为正确的类型。我建议使用instanceof来确定。
如果您计划在运行时的任何时候添加,删除或重命名组件,我会考虑添加根据您的更改修改HashMap的方法。