我有一个超过50个JTextfield的类,它们都包含文本
如何在不调用代码中的字段的情况下从所有Textfield获取文本。
我试过了:
Field[] fields = getClass().getDeclaredFields();
for (Field field : fields) {
if (field.getName().contains("_") == true) {
// .getText();
}
}
然后我必须从字段中获取文本但是如何管理它?
或者让某人更好地了解这些值?
答案 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);
...
换句话说:
请注意:我的代码旨在让您前进 - 我没有通过编译器运行它或测试它。所以,要小心拼写错误。但它应该足以进行自己的实验并帮助你取得进步。
编辑,关于你的问题:所有这些反射获取/设置方法都需要某个对象来处理。含义:您需要一个“反射”的类的实例(除非您在谈论静态字段)。有关详细信息,请参阅here或there。
警告的最后一句话;因为在使用反射时你应该知道两个的事情:
所以,长话短说,并且考虑到你的问题:你似乎不非常了解反思。从这个意义上说:要非常小心。并且可能会重新思考是否有其他非反映方式来解决您的问题!