4

我正在编写一个选项面板,为了在开发应用程序时能够更快地添加更多选项,我决定将所有输入的组件放在一个框架中,我需要从配置中加载它们的值并设置相应的text 但似乎无法从字段中获取组件的文本。我得到一个:
线程“AWT-EventQueue-0”中的异常 java.lang.RuntimeException:无法编译的源代码 - 错误的符号类型:java.awt.Component.setText
名称:服务器类:类 javax.swing.JTextField

private void loadConfigs() {
    List<Component>  compList = getAllComponents(this);
    System.out.println("Tamaño "+compList.size());
    for(int i=0; i<compList.size();i++) {
       if(compList.get(i).getName() != null) {
           System.out.println("Nombre: "+compList.get(i).getName() +" Clase:"+ compList.get(i).getClass().toString());
           if(compList.get(i).getClass().toString().matches("class javax.swing.JTextField")) {
               System.out.println("Machea load " +compList.get(i).getName() + compList.get(i).toString());
               compList.get(i).setText(rootFrame.config.get(compList.get(i).getName()));
           }
           else if(compList.get(i).getClass().toString().matches("class javax.swing.JCheckBox")) {
                if (rootFrame.config.get(compList.get(i).getName()) == null) {
                    compList.get(i).setSelected(false);
                }
                else {
                    compList.get(i).setSelected(true);
                }
           }
       }
    }
}
public static List<Component> getAllComponents(final Container c) {
    Component[] comps = c.getComponents();
    List<Component> compList = new ArrayList<Component>();
    for (Component comp : comps) {
        compList.add(comp);
        if (comp instanceof Container) {
            compList.addAll(getAllComponents((Container) comp));
        }
    }
    return compList;
}
4

2 回答 2

12

这里:

compList.get(i).setText(....)

编译器仅将compList.get(i)其视为组件。要使用 JTextField 方法,您必须首先将其转换为 JTextField。

((JTextField)compList.get(i)).setText(....)

不过,在我看来,您的计划似乎很笨拙且非常不符合 OOP。

也许您想创建一个Map<String, JTextField>并为该类提供一个公共方法,以获取与代表 JTextField 所代表内容的字符串关联的文本字段所持有的字符串。

于 2012-04-29T16:42:40.743 回答
7

你应该使用这样的东西:

if(compList.get(i) instanceof JTextField) {
    JTextField field = (JTextField) compList.get(i);
    field.getText(); // etc
}

而不是getClass().toString你一直在做的检查。

于 2012-04-29T16:44:26.427 回答