【问题标题】:What is the better way to get swing components获得摆动组件的更好方法是什么
【发布时间】:2013-11-22 11:56:52
【问题描述】:

我正在使用 Eclipse 的 Window Builder 插件来构建 Java Swing 桌面应用程序前端。 问题是,在 Action Listener 上,当我想获取组件的值时,我会按索引单独获取组件。 见代码 sn-p

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,所有元素的索引都会改变。有没有更好的方法来实现这一点?

【问题讨论】:

  • 你的意思是你想在一些动作事件上添加组件?
  • @rachana 不,我的意思是,如果有很多组件,那么重组组件的位置或将它们添加到容器中将导致类转换异常,即 JCheckBox endUserLabel = (JCheckBox) components[4]; 将通过异常 b/c 标签可能是在其他索引上。
  • 然后在执行你的代码之前检查它是否是JCheckBox.class。

标签: java swing desktop-application


【解决方案1】:

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

附带说明,如果您要继续处理此项目,请手动丢弃 GUI 构建器和代码。从长远来看,这将节省您的精力,并帮助您更快地学习 Swing。

【讨论】:

  • 我实际上是通过在ActionListener 中获取这些组件的值来填充我的类对象。你能举例说明你想说什么吗?您的意思是我使用 bean 绑定框架,以便在调用 ActionListener 时已经填充了我的模型对象?
  • 我不是在谈论 bean 绑定框架。我说的只是对组件的简单引用,以便能够直接访问它们的值,而不是依赖父组件列表。
【解决方案2】:

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

跟踪解决方案:

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

解决办法:

  • 在您的小部件上设置“名称”属性,并创建一个方法,在组件树中按名称解析它们。

更好的解决方案:

  • 使用数据绑定,因此对小部件的更改会反映在表示模型上,并且始终通过模型而不是小部件读取/写入值。

跟踪示例:

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());
    }
});

【讨论】:

  • 我会选择更好的解决方案 :),您是否推荐任何简单的 bean 绑定解决方案,它在 DataModel 上填充数据?
  • 看看 JGoodies 绑定:jgoodies.com/freeware/libraries/binding
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-17
  • 2014-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多