使用ComponentFinder

时间:2016-02-16 14:29:15

标签: java swing testing

我有一个代码(摇摆):

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

我应该改变什么?

祝你好运

2 个答案:

答案 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的方法。