2013-02-02 41 views
0

我必須這樣做:我有一個JTextField和按鈕。而當我寫入該TextField輸出必須在JLabel中顯示結果。如何在JLabel中顯示JTextField的輸入?如何修復反射錯誤?

  1. 要求用戶提供一個類的名稱。
  2. 使用Class.forName()獲得對Java Reflection API的訪問。
  3. 使用默認構造函數創建類的新實例(即對象)。
  4. 查找並顯示在形式,包括繼承的字段的類的所有字段:

field_type FIELD_NAME:(FIELD_VALUE(JTextField中))(設置(按鈕))

FIELD_VALUE必須是文本框,所以用戶可以通過按'設置'按鈕來改變數值。新值必須更新爲該對象。如果該字段包含複雜類型(對象,集合等)的值,則不應創建文本框和「設置」按鈕。

  1. 查找並顯示的類別,包括繼承的方法的所有方法: return_type METHOD_NAME(param_type1(param_value1(JTextField中)),param_type2(param_value2(JTextField中)),...)(調用(按鈕))

如果某個方法具有複雜類型(對象,集合等)的參數,那麼只顯示參數的類型,則會跳過param_values的文本框和「調用」按鈕。 當用戶按下「調用」按鈕時,應用程序必須調用該方法。確保如果該方法更改字段的值,則會顯示這些更改。

和我的代碼在這裏:

 import java.awt.FlowLayout; 
    import java.awt.event.ActionEvent; 
    import java.awt.event.ActionListener; 
    import java.lang.reflect.Constructor; 
    import java.lang.reflect.Field; 
    import java.lang.reflect.InvocationTargetException; 
    import java.lang.reflect.Method; 
    import java.lang.StringBuffer; 
    import java.util.Scanner; 
    import javax.swing.JButton; 
    import javax.swing.JFrame; 
    import javax.swing.JLabel; 
    import javax.swing.JPanel; 
    import javax.swing.JTextField; 

    public class ReflectionTest { 

private String class_name = "java.lang.StringBuffer"; 

public ReflectionTest() throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException{ 
    JLabel jl1 = null, jl2, jl3, jl4; 
    JFrame jf = new JFrame("New"); 
    JPanel jp = new JPanel(); 
    JTextField jtf = new JTextField(20); 
    JButton jb = new JButton("Press"); 
    jtf.setVisible(true); 
    jp.add(jb); 
    jp.add(jtf); 

    jf.add(jp); 
    jf.setVisible(true); 
    jf.setSize(400, 550); 
    jf.setResizable(false); 


    String text = jtf.getText().toString(); 

    Class cs = Class.forName(text); 

    jb.addActionListener(
       new ActionListener() { 
        public void actionPerformed(ActionEvent e) { 
         // THIS CODE IS EXECUTED WHEN RETURN IS TYPED 
        } 
       } 
      ); 

    for(Constructor c: cs.getConstructors()){ 
     for(Class p: c.getParameterTypes()) 
      System.out.print(p.getName()+" "); 
     System.out.println(); 
    } 

    Constructor c = cs.getConstructor(new Class[]{String.class}); 
    Object list = c.newInstance("AA"); 


    Field pub_fields[] = cs.getFields(); 
    Field all_fields[] = cs.getDeclaredFields(); 
    System.out.println("Public fields:"); 
    for(Field f:pub_fields){ 

     //Showing public fields 
     System.out.println(); 
     jl1 = new JLabel(f.getType().getName() + " " + f.getName()); 
     jp.add(jl1); 
     jl1.setVisible(true); 
       } 
    System.out.println("All declared fields:"); 
    for(Field f:all_fields){ 

     //Showing all declared fields 

     jl2 = new JLabel(f.getType().getName() + " "+f.getName()+" "); 
     jp.add(jl2); 
     jl2.setVisible(true); 

     f.setAccessible(true); 
     Object val = f.get(list); 
     if (val != null){ 
      //System.out.println(val.toString()); 
      jl3 = new JLabel(val.toString()); 
      jp.add(jl3); 
      jl3.setVisible(true); 
      System.out.println(); 
      } 
     else{ 
      System.out.println("NULL"); 
     //f.get(list1); 
    } 
    } 

} 

/** 
* @param args 
* @throws ClassNotFoundException 
*/ 
public static void main(String[] args) { 
    try{ 
    // TODO Auto-generated method stub 
     new ReflectionTest(); 
    } 
    catch (Exception e){ 
     e.printStackTrace(); 
    } 
} 
    } 

和我有錯誤。 Eclipse將其顯示在以下行中: Class cs = Class.forName(text);

+1

日食顯示什麼錯誤? –

+0

tag edit:[tag:java-ee]標籤被移除,因爲問題與Java Enterprise Edition無關。添加了[tag:swing]標籤,因爲它與Swing完全相關。 –

+0

請參閱編輯以回答。 –

回答

2

這真的是錯誤還是「黃色」? Class是一個參數化類型,如果您不使用泛型,則eclipse將顯示警告。

爲了消除這樣的警告,只需做一個

Class<?> cs = Class.forName(text); 

通配符是可以的,因爲你真的不知道這「型」類的你要加載。

+0

(upvoter - 我完全改變了我的答案的內容,第一個是明顯錯誤的,僅供參考) –

+0

最初是我投票給你的。 –

+0

我忽略了構造函數拋出異常,所以缺少異常處理不成問題。 –

3

如果發生前的異常,例如通過它打印出來測試的文本字符串:

System.out.printf("text = \"%s\"%n", text); 
    Class cs = Class.forName(text); 

將返回:

text = "" 
java.lang.ClassNotFoundException: 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Unknown Source) 
    at pkg.ReflectionTest.<init>(ReflectionTest.java:42) 
    at pkg.ReflectionTest.main(ReflectionTest.java:102) 

你會看到文本字符串是空的, ""。這是因爲您在調用Class cs = Class.forName(text);時沒有文本,因爲它在GUI已被渲染之前被調用,更不用說給用戶輸入文本的時間。只能在由於某種用戶生成的事件(如ActionListener的actionPerformed方法)而被調用的代碼中調用此方法。

換句話說,增加關鍵代碼在自己的commment你的國家,在那裏你應該添加代碼:

jb.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     // THIS CODE IS EXECUTED WHEN RETURN IS TYPED // *********!!!! 
    } 
    }); 

我第二次評論,你應該表現出任何及所有信息關於例外。請不要讓我們猜測問題是什麼。

編輯
你也必須使用局部變量,包括中的JLabel和JTextField中,匿名內部監聽器類的內部問題。解決這個問題的最簡單和最好的方法是在這個監聽器私有類字段中創建需要訪問的變量。因此,從構造函數中刪除它們的聲明,而是將它們移到該類本身。

+1

啊 - 他在說一個運行時錯誤;) –

+0

+ 1爲編輯,這是DocumentListener的工作,而不是用易碎和哈克反射, – mKorbel

+0

@mKorbel shoting,我認爲他可能需要反射,無論如何,因爲這似乎是作業的關鍵 - 要在GUI中顯示任何類的對象的組件,並允許通過GUI修改它們。 –

相關問題