簡體   English   中英

當field為JTextfield時,java.lang.reflect.field getText

[英]java.lang.reflect.field getText when field is JTextfield

我有一個超過50個JTextfield的類,它們都包含文本

如何從所有文本字段中獲取文本,而無需再次調用代碼中的字段。

我試過了:

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

然后,我必須從字段中獲取文本,但是如何管理呢?

還是有人對這些價值觀有更好的主意?

正如《氣墊船充滿鰻魚》所建議的那樣,一個干凈的實現將問題分開:對字段進行分組並對其進行處理。 特別是如果通過反射進行分組。
以下代碼更具可讀性和可維護性。

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個JTte​​xtField的UPDATE

在這種情況下,我建議的另一種解決方案可能更合適。 確實,有十二個字段,冒着忘記在列表中添加JTextField的可能性很小,但是有50多個,我們可以理解這是一個容易出錯的處理。 創建自定義JTextField可能是更好的選擇。 想法如下:用新的類JTextFieldWatched擴展JTextFieldWatched並用附加參數強制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的情況下編寫的,因此如果有任何錯誤,請抱歉。

您可以使用反射來計算字段的實際類型,例如:

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對象,您可以直接調用該類的方法!

請注意:我的代碼旨在幫助您-我沒有通過編譯器運行它或對其進行測試。 因此,請注意錯別字。 但這足以進行您自己的實驗並幫助您取得進步。

編輯,關於您的問題:所有這些反射獲取/設置方法都需要您處理一些對象 含義:您需要“反射”該類的實例 (除非您在談論靜態字段)。 請參閱此處那里以進一步閱讀。

最后的警告詞; 因為使用反射時應該知道件事:

  1. 僅在沒有其他方法可以解決您的問題時使用它。 切勿使用它,因為它看起來很方便,但是因為沒有其他方法來獲得所需的東西!
  2. 僅當您了解反射的100%時才使用它。 事實是:很容易 弄錯反射。 而且您只會在運行時注意到。 您可以輕松地花費數小時編寫反射代碼並嘗試使其工作; 從一個微妙的問題過渡到下一個問題。 獲取反射代碼很難 更痛苦的是:“被反映”的代碼中的細微變化會破壞您使用反射的代碼; 而且直到運行該代碼,您才注意到!

所以,長話短說,並給予你的問題:你似乎不太了解反思。 從這個意義上說:要非常小心。 也許要重新考慮是否有其他非反思性的方法來解決您的問題!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM