什么是获得摆动组件的更好方法

时间:2013-11-22 11:56:53

标签: java swing desktop-application

我正在使用Eclipse的Window Builder插件来构建Java Swing Desktop应用程序Front End。 问题是,当我想获取组件的值时,在Action Listener上,我逐个索引获取组件。 请参阅代码段

public class SomeListener implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent event) {


        //button from which action is triggered 
        JButton startTestButton = (JButton) event.getSource();

        //components 
        Component[] components = startTestButton.getParent().getComponents();           

        //Get individual components
        JCheckBox endUserLabel = (JCheckBox) components[0];
    }   
}

问题是,当新元素添加到容器时,假设一个JTextBox,所有元素的索引都会被更改。有没有更好的方法来实现这个目标?

2 个答案:

答案 0 :(得分:0)

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

作为旁注,如果您要继续处理此项目,请手动删除GUI构建器和代码。它将为您节省长期的工作量,并将帮助您更快地学习Swing。

答案 1 :(得分:0)

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

跟踪解决方案:

  • 为小部件创建属性(实例字段)
  • 跟踪地图中的小部件

解决方案:

  • 在小部件上设置'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());
    }
});