1

使用 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拥有所有元素,而不是包装器 - 我觉得更合适。更多的是,现在所有(ie)GridBagConstraints都必须放在视图中。

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

但是,我确信有更漂亮的 OOP 方式来实现这一点?

4

1 回答 1

2

好吧,我不相信这里有灵丹妙药的解决方案。

当我使用 Swing 工作时,我试图记住以下几点: - 使用封装。将您的 Panel 视为可重复使用的组件。- 尽可能将数据层与视图解耦。

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

希望这可以帮助

于 2013-01-13T18:45:33.923 回答