我試圖訪問所有公共領域在擴展的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