我遇到FEST的问题:
我在JtextField
中有四个JDialog
个。如果我有四个JTextField
s,其中属性JTextField
,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);
}
}
答案 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);
}
}
}
}