如何使用FEST获取某个组件

时间:2012-03-01 13:06:25

标签: java swing automated-tests fest

我遇到FEST的问题:

我在JtextField中有四个JDialog个。如果我有四个JTextField s,其中属性JTextFieldnametext未定义或为空,我如何获得某个visibility

public class Form1 {
    public static void main(String[] args) {
        JTextField tf1 = new JTextField();
        JTextField tf2 = new JTextField();
        JTextField tf3 = new JTextField();
        JTextField tf4 = new JTextField();

        tf1.setPreferredSize(tf1.getPreferredSize());
        tf1.setText("");
        tf2.setPreferredSize(tf2.getPreferredSize());
        tf2.setText("");
        tf3.setPreferredSize(tf3.getPreferredSize());
        tf3.setText("");
        tf4.setPreferredSize(tf4.getPreferredSize());
        tf4.setText("");

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new GridLayout(1, 1));
        frame.add(tf1);
        frame.add(tf2);
        frame.add(tf3);
        frame.add(tf4);
        frame.setSize(300, 85);
        frame.setVisible(true);
    }
}

1 个答案:

答案 0 :(得分:1)

这是一个使用Reflection为对象中包含的所有JComponent实例运行setName的方法。如果对象内部存在循环引用,它将显示堆栈溢出错误。

public static void assignComponentNames(Object obj) {

    try {

        Method getComponentsMethod = obj.getClass().getMethod("getComponents", new Class[]{});

        if (null != getComponentsMethod){
            try {
                for (Component component : (Component[])(getComponentsMethod.invoke(obj))){
                    assignComponentNames(component);
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            } catch (InvocationTargetException e) {
                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            }
        }
        else {
            System.out.println(obj.toString());
        }
    } catch (NoSuchMethodException e) {
        e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
    }

    for (Field field : obj.getClass().getDeclaredFields()) {
        field.setAccessible(true);

        String fieldName = field.getName(); //this is a different name, the reflection level name
        Object fieldValue = null;

        try {
            fieldValue = field.get(obj);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        if (null == fieldValue) {
            continue;
        }

        if (fieldValue instanceof JComponent) {

            String currentComponentNameForFieldValue = ((JComponent) fieldValue).getName();

            if (null == currentComponentNameForFieldValue){
                System.out.println("null component name");
                ((JComponent) fieldValue).setName(fieldName);  //this sets the name specially for JComponent
            }
        }
        else if(fieldValue instanceof Collection){

            for (Object subObject : ((Collection)fieldValue).toArray()) {

                assignComponentNames(subObject);
            }
        }

    }
}