Как получить определенный компонент, используя FEST - PullRequest
1 голос
/ 01 марта 2012

У меня проблема с FEST :

У меня есть четыре JtextField с в JDialog. Как я могу получить определенное значение JTextField, если у меня есть четыре JTextField s, где атрибуты name, text и 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 Ответ

1 голос
/ 29 июня 2012

Вот метод для запуска setName для всех экземпляров JComponent, содержащихся внутри объекта, с использованием Reflection. Он покажет ошибку переполнения стека, если внутри объекта есть циклические ссылки.

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);
            }
        }

    }
}
...