2017-08-27 70 views
0

我试图访问所有公共领域在扩展的JPanel类,所以我可以重新设置他们,但我不能一个字段转换为JCheckBoxJTextAreaJava反射 - 铸造场到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); 

但他们都是给我的错误,他们是这个名字的方法。

+0

这看起来不像反射的良好用法,并且表明设计问题与您写对象的方式有关。 (太多领域?)你应该可能使用数组或其他东西。反思是为调试和序列化等东西编写通用API。另见https://docs.oracle.com/javase/tutorial/reflect/和https://meta.stackexchange.com/q/66377/244864。 – Radiodef

+0

感谢这些链接,原因有很多,是因为我制作的程序是针对需要大量GUI字段的第一线技术支持部门,因此它可以为第二线团队生成升级模板。我会看看XY链接,它看起来对发布问题很有用。 – Martin

+0

好吧,因此我建议使用类似数组的东西。如果你有很多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

回答

-1

如果你想这样做使用Field,那么你应该这样做,如:

JCheckBox demo = (JCheckBox) inputs[i].get(page); 

您将无法区分FieldJCheckBox,你需要先获得的价值,然后你可以施放因此您需要在定义该复选框的面板上调用get方法。

+0

感谢您的回答,但我发现一个奇怪的错误:java.lang.IllegalArgumentException异常:无法设置javax.swing.JCheckBox中的场LTE_NoConnection_CatSix.chckbxWifiOn_YES到TicketBuilder \t在sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(来源不明) \t在sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(未知来源) \t在sun.reflect.UnsafeFieldAccessorImpl.ensureObj(未知来源) \t在sun.reflect.UnsafeObjectFieldAccessorImpl.get(未知来源) \t Thread.run(未知来源) – Martin

+0

'不能将javax.swing.JCheckBox字段LTE_NoConnection_CatSix.chckbxWifiOn_YES设置为TicketBuilder'这是一个不同的我然后是什么你原来提出,我不能进一步评论,而不看你的代码。 – SMA

+0

对不起,你的回答是对的,'这'是我把'网页'是。谢谢你的帮助。 – Martin