2017-08-27 61 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