访问子面板元素的更漂亮的解决方案

时间:2013-01-13 17:41:23

标签: java swing oop user-interface

使用Java的Swing,您通常必须包装元素才能实现所需的布局。然而,这些面板的元素确实需要由超级面板(进一步称为 view )访问,例如,表单提交。

考虑以下(简化)示例:

class AddUserView extends JPanel {

   private JPanel elementWrapper = new JPanel();
   private JPanel buttonWrapper = new JPanel();

   private JTextField userNameField = new JTextField();
   private JButton submitButton = new JButton("Submit");

   public AddUserView() {

      // .. add elements to the wrappers
      elementWrapper.add(userNameField);
      buttonWrapper.add(submitButton);

      // .. add listeners etc

      // Add the wrappers to the view
      add(elementWrapper);
      add(buttonWrapper);

   }

}

这显然有效,但我相信这是一个丑陋的解决方案,因为现在view拥有所有元素,而不是包装 - 我认为更合适。更多的是,现在所有(即)GridBagConstraints都必须放在视图中。

一个解决方案当然可以是将所有元素放在适当的包装器类中,然后将其设置为public + final,或创建一个bazillion getters & setters

但是,我确定有一种更漂亮的OOP方式来实现这一目标吗?

1 个答案:

答案 0 :(得分:2)

嗯,我不相信这里有一个银弹解决方案。

当我以前使用Swing时,我试着记住以下内容: - 使用封装。将您的Panel视为可重用的组件。 - 尽可能将数据层与视图分离。

当应用于您的问题时,这可能意味着以下内容:   - AppUserView面板唯一知道的是2个包装器:elementWrapper和buttonWrapper。这些是“黑盒子” - 可重复使用的组件,可以通过AppUserView“按原样”使用。 每个“包装器”都有按钮/文本字段/无论它需要什么。 数据模型应该与这些视图完全分离,应该通过事件进行唯一的交互,当模型决定它应该触发某些事件时,相关的视图应该被注册为这些事件的监听器并分别作出反应。

希望这有帮助