[英]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個JTtextField的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);
...
換一種說法:
請注意:我的代碼旨在幫助您-我沒有通過編譯器運行它或對其進行測試。 因此,請注意錯別字。 但這足以進行您自己的實驗並幫助您取得進步。
編輯,關於您的問題:所有這些反射獲取/設置方法都需要您處理一些對象 。 含義:您需要“反射”該類的實例 (除非您在談論靜態字段)。 請參閱此處或那里以進一步閱讀。
最后的警告詞; 因為使用反射時應該知道兩件事:
所以,長話短說,並給予你的問題:你似乎不太了解反思。 從這個意義上說:要非常小心。 也許要重新考慮是否有其他非反思性的方法來解決您的問題!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.