Java 获取swing组件的更好方法是什么

Java 获取swing组件的更好方法是什么,java,swing,desktop-application,Java,Swing,Desktop Application,我正在使用WindowsBuilderPluginforEclipse构建一个JavaSwing桌面应用程序前端。 问题是,在ActionListener上,当我想要获取组件的值时,我会逐个地按索引获取组件。 请参阅代码片段 问题是,当任何新元素被添加到容器中时,比如说一个JTextBox,所有元素的索引都会改变。有没有更好的方法来实现这一点?是的,不要依赖getComponents()中的索引。相反,请使用所需的正确引用或对控制器对象的引用来设置ActionListener,该控制器对象可以

我正在使用WindowsBuilderPluginforEclipse构建一个JavaSwing桌面应用程序前端。 问题是,在ActionListener上,当我想要获取组件的值时,我会逐个地按索引获取组件。 请参阅代码片段


问题是,当任何新元素被添加到容器中时,比如说一个JTextBox,所有元素的索引都会改变。有没有更好的方法来实现这一点?

是的,不要依赖
getComponents()
中的索引。相反,请使用所需的正确引用或对控制器对象的引用来设置
ActionListener
,该控制器对象可以在GUI中进行所需的更改。在调用
actionPerformed()
方法之前执行所有这些操作


作为补充说明,如果您要继续处理此项目,请手动扔掉GUI生成器和代码。它将长期节省您的精力,并帮助您更快地学习Swing。

如果您想访问侦听器中的特定小部件,您需要跟踪它们或提供解决它们的方法

跟踪解决方案:

  • 为小部件创建属性(实例字段)
  • 跟踪地图中的小部件
解决方案与解决方案:

  • 在小部件上设置“name”属性,并在组件树中创建一个按名称解析它们的方法
更好的解决方案:

  • 使用数据绑定,使小部件上的更改反映在表示模型上,并且读/写值始终在模型上,而不是在小部件上
跟踪示例:

final JTextField textField = new JTextField();
textField.setName("userinput");

JButton ok = new JButton("OK");
ok.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed (ActionEvent e) {
        System.out.println("Text: " + textField.getText());
    }
});

你的意思是想在某个动作事件上添加组件?@rachana否,我的意思是,如果有很多组件,那么重新构造组件的位置或将它们添加到容器中将导致类强制转换异常,即
JCheckBox endUserLabel=(JCheckBox)组件[4]将通过异常b/c,标签可能位于其他索引上。然后在执行代码之前检查它是否为JCheckBox.class。我实际上是通过在
ActionListener
中获取这些组件的值来填充我的类对象。你能举例说明你想说什么吗?你的意思是我使用bean绑定框架,这样当调用
ActionListener
时,我的模型对象就已经被填充了吗?我不是说bean绑定框架。我只是在讨论一个简单的引用,您的组件可以直接访问它们的值,而不是依赖父组件列表。我将选择更好的解决方案:),您是否建议任何简单的bean绑定解决方案,它填充数据模型上的数据?请看一下Jgoodes绑定:
final JTextField textField = new JTextField();
textField.setName("userinput");

JButton ok = new JButton("OK");
ok.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed (ActionEvent e) {
        System.out.println("Text: " + textField.getText());
    }
});