当字段是JTextfield时,java.lang.reflect.field getText

时间:2016-11-06 19:37:38

标签: java swing reflection jtextfield gettext

我有一个超过50个JTextfield的类,它们都包含文本

如何在不调用代码中的字段的情况下从所有Textfield获取文本。

我试过了:

    Field[] fields = getClass().getDeclaredFields();       
    for (Field field : fields) {        
        if (field.getName().contains("_") == true) {
            // .getText();
        }
    }

然后我必须从字段中获取文本但是如何管理它?

或者让某人更好地了解这些值?

2 个答案:

答案 0 :(得分:4)

正如Hovercraft Full Of Eels建议的那样,一个干净的实现将事情分开:分组字段聚集并对它们进行处理。 特别是,如果通过反射进行分组 以下代码更易读和可维护。

public class MyComponent extends JFrame{
  List<JTextField> fields = new ArrayList(); 

  private JTextField textField1;
  private JTextField textField2;
  private JTextField textField3;

  public MyComponent(){
   textField1 = new JTextField ("");
   textField2 = new JTextField ("");
   textField3 = new JTextField ("");
   addTextFieldInList(textField1, textField2, textField3);
  }

  public void addTextFieldInList(JTextField fieldArgs...) {
    fields.addAll(Arrays.asList(fieldArgs));
  }

  public void iterateAllTextFields(){
    for (JTextField field : fields){
      String yourValue = field.getText();
    }    
}

在更新问题后更新,其中指定处理句柄超过50 JTtextField

在这种情况下,我提出的另一种解决方案可能更合适。 实际上,有十几个字段,冒着忘记在列表中添加JTextField的风险不太可能,但是超过50,我们可以理解这是一个容易出错的处理。创建自定义JTextField可能是更好的选择。 这个想法如下:使用新类JTextFieldWatched扩展JTextField并使用附加参数强制JTextFieldWatched构造函数:注册JTextField个实例的对象。

JTextFieldWatched扩展了JTextField

public class JTextFieldWatched extends JTextField{
  public JTextFieldWatched(String text, JTextFieldWatcher textFieldWatcher){
    super(text);
    if (textFieldWatcher==null){
      // force the constraint
      throw new IllegalArgumentException("textFieldWatcher is mandatory");
    }        
     textFieldWatcher.add(this);
  }
}

注册JTextfield个实例的类:

public class JTextFieldWatcher {
   List<JTextField> fields = new ArrayList(); 

   public void add(JTextField textField){
      fields.add(textField);
   }   

   public List<JTextField> getAllTextField(){
      return new ArrayList(fields);
   }
}

如何使用这些类:

public class MyComponent extends JFrame{
  private JTextFieldWatcher fieldsWatcher = new JTextFieldWatcher();

  private JTextFieldWatched textField1;
  private JTextFieldWatched textField2;
  private JTextFieldWatched textField3;

  public MyComponent(){
   textField1 = new JTextFieldWatched ("",fieldsWatcher);
   textField2 = new JTextFieldWatched ("",fieldsWatcher);
   textField3 = new JTextFieldWatched ("",fieldsWatcher);
  }   

  public void iterateAllTextFields(){
    for (JTextField field : fieldsWatcher.getAllTextField()){
      String yourValue = field.getText();
    }    
  }
}

所有代码都是在没有IDE的情况下编写的,如果有任何错误,请对不起。

答案 1 :(得分:3)

您可以使用反射来计算字段的实际类型,例如:

Field[] fields = getClass().getDeclaredFields();       
for (Field field : fields) {  
    Class<?> fieldType = field.getType();
    if (fieldType.isAssignableFrom(JTextfield.class)) {
      JTextField jtf = (JTextField) field.get(owningobject);       
 ...

换句话说:

  1. 您可以检查字段“是”是否为JTextField( >比依赖某些约定更好,其中名称中带有“_”的任何内容都是文本字段)
  2. 如果是这样,你只需获取字段的值,并将其转换为真实类型......然后,你有一个JTextField对象,你可以调用该类的方法直接!
  3. 请注意:我的代码旨在让您前进 - 我没有通过编译器运行它或测试它。所以,要小心拼写错误。但它应该足以进行自己的实验并帮助你取得进步。

    编辑,关于你的问题:所有这些反射获取/设置方法都需要某个对象来处理。含义:您需要一个“反射”的类的实例(除非您在谈论静态字段)。有关详细信息,请参阅herethere

    警告的最后一句话;因为在使用反射时你应该知道两个的事情:

    1. 只有在没有其他方法可以解决您的问题时才使用它。永远不要使用它,因为它看似方便,但因为没有其他方法可以得到你所需要的东西!
    2. 只有在理解了100%的反射时才使用它。事情是:超级容易来反映错误。而你只是在运行时注意到。您可以轻松地花费数小时编写反射代码并尝试使其工作;从一个微妙的问题运行到下一个。获取反射代码很难。更痛苦的是:“被反映”的代码中的细微变化可以打破你的反射 - 使用代码;并且在运行该代码之前你没有注意到!
    3. 所以,长话短说,并且考虑到你的问题:你似乎非常了解反思。从这个意义上说:要非常小心。并且可能会重新思考是否有其他非反映方式来解决您的问题!