2017-08-27 10 views
0

私はJPanelのを拡張するクラスのすべてのパブリックフィールドにアクセスしようとしていますので、私はそれらをリセットすることができますが、私はJCheckBoxにフィールドをキャストすることはできませんスイングするフィールドをキャスト、JTextAreaなどJavaリフレクション - 入力

は、ここに私です私はちょうど入力 'サブ' メソッドにアクセスする必要があり

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も参照してください。私が作っているプログラムは、第2ラインチームにエスカレーションテンプレートを生成することができるようにGUIフィールドを大量に必要とする最初の行の技術サポート部門のためであるので、リンク用の – Radiodef

+0

おかげで、非常に多く存在している理由があります。 XYリンクを見てみましょう。質問を投稿するのに便利です。 – Martin

+0

それで、私の提案は配列のようなものを使うことです。 GUIフィールドがたくさんある場合、正しいと思われるアプローチは、 'クラスウィジェット{}'と 'List 'を持つことです( 'ウィジェット 'は共通を表すタイプです)すべての分野の要因その他の役立つリンク:https://en.wikipedia.org/wiki/SOLID_(object-oriented_design)、https://www.youtube.com/watch?v=8bZh5LMaSmE、https://www.youtube.com/ watch?v = v-2yFMzxqwUは、優れたオブジェクト指向プログラム設計の多くの面を示す2つのビデオです。 – Radiodef

答えて

-1

あなたがFieldを使用してそれを実行したい場合、あなたは以下のようにそれを行う必要があります:あなたはJCheckBoxFieldをケースにできるように文句を言わない

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

、あなたが最初の値を取得する必要があり、その後、あなたがキャストできますしたがって、このチェックボックスが定義されているパネルでgetメソッドに呼び出す必要があります。

+0

あなたの答えのおかげで、私は奇妙なエラーになっています:java.lang.IllegalArgumentExceptionが:sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentExceptionでTicketBuilder \tにjavax.swing.JCheckBoxフィールドLTE_NoConnection_CatSix.chckbxWifiOn_YESを設定することはできません(不明なソース) \tをsun.reflect.UnsafeObjectFieldAccessorImpl.get(不明なソース)でsun.reflect.UnsafeFieldAccessorImpl.ensureObjでsun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentExceptionで(不明なソース) \t(不明なソース) \t \t Thread.run(不明なソース) – Martin

+0

'これは違う私ですTicketBuilder'するjavax.swing.JCheckBoxフィールドLTE_NoConnection_CatSix.chckbxWifiOn_YESを設定できませんあなたが元気づけたものをssueして、私はあなたのコードを見ずにさらにコメントすることはできません。 – SMA

+0

申し訳ありませんが、あなたの答えは、「これは私が「ページ」だったを入れているところ、右でした。ご協力いただきありがとうございます。 – Martin

関連する問題