我试图访问所有公共领域在扩展的JPanel类,所以我可以重新设置他们,但我不能一个字段转换为JCheckBox
,JTextArea
等Java反射 - 铸造场到Swing输入
这里是我的尝试
public void clearPage(JPanel page) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, ClassNotFoundException
{
//Basic class using Swing elements (JtextFields, JCheckBoxes etc.)
Field[] inputs = page.getClass().getFields(); //Works, I get all Fields
for (int i = 0;i<inputs.length;i++)
{
if (inputs[i].getType().getName().equals("javax.swing.JCheckBox"))//Works
{
JCheckBox demo = (JCheckBox) inputs[i]; //(Cannot cast from Field to JCheckBox)
//Second Try
//JCheckBox str = (JCheckBox) Class.forName("javax.swing.JCheckBox").cast(inputs[i]);
//str.setSelected(false);
//Cannot cast java.lang.reflect.Field to javax.swing.JCheckBox
}
}
}
我只需要访问输入 '子' 的方法:
.SetText
.setSelected
等
我一直试图让我需要在使用该方法的方法:
Method d = inputs[i].getClass().getDeclaredMethod("setSelected", boolean.class);
inputs[i].getType().getClass().getMethod("setSelected", boolean.class);
但他们都是给我的错误,他们是这个名字的方法。
这看起来不像反射的良好用法,并且表明设计问题与您写对象的方式有关。 (太多领域?)你应该可能使用数组或其他东西。反思是为调试和序列化等东西编写通用API。另见https://docs.oracle.com/javase/tutorial/reflect/和https://meta.stackexchange.com/q/66377/244864。 – Radiodef
感谢这些链接,原因有很多,是因为我制作的程序是针对需要大量GUI字段的第一线技术支持部门,因此它可以为第二线团队生成升级模板。我会看看XY链接,它看起来对发布问题很有用。 – Martin
好吧,因此我建议使用类似数组的东西。如果你有很多GUI字段,那么更可能是正确的方法是(粗略地说)有一个'class Widget {}'和一个'List',其中'Widget'是代表公共类型的一些类型所有领域的因素。其他一些有用的链接:https://en.wikipedia.org/wiki/SOLID_(object-oriented_design),https://www.youtube.com/watch?v = 8bZh5LMaSmE和https://www.youtube.com/观看?v = v-2yFMzxqwU这两个视频展示了很多面向对象的良好程序设计。 –
Radiodef