我必須這樣做:我有一個JTextField和按鈕。而當我寫入該TextField輸出必須在JLabel中顯示結果。如何在JLabel中顯示JTextField的輸入?如何修復反射錯誤?
- 要求用戶提供一個類的名稱。
- 使用Class.forName()獲得對Java Reflection API的訪問。
- 使用默認構造函數創建類的新實例(即對象)。
- 查找並顯示在形式,包括繼承的字段的類的所有字段:
field_type FIELD_NAME:(FIELD_VALUE(JTextField中))(設置(按鈕))
FIELD_VALUE必須是文本框,所以用戶可以通過按'設置'按鈕來改變數值。新值必須更新爲該對象。如果該字段包含複雜類型(對象,集合等)的值,則不應創建文本框和「設置」按鈕。
- 查找並顯示的類別,包括繼承的方法的所有方法: 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);
日食顯示什麼錯誤? –
tag edit:[tag:java-ee]標籤被移除,因爲問題與Java Enterprise Edition無關。添加了[tag:swing]標籤,因爲它與Swing完全相關。 –
請參閱編輯以回答。 –