使用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方式来实现这一目标吗?
答案 0 :(得分:2)
嗯,我不相信这里有一个银弹解决方案。
当我以前使用Swing时,我试着记住以下内容: - 使用封装。将您的Panel视为可重用的组件。 - 尽可能将数据层与视图分离。
当应用于您的问题时,这可能意味着以下内容: - AppUserView面板唯一知道的是2个包装器:elementWrapper和buttonWrapper。这些是“黑盒子” - 可重复使用的组件,可以通过AppUserView“按原样”使用。 每个“包装器”都有按钮/文本字段/无论它需要什么。 数据模型应该与这些视图完全分离,应该通过事件进行唯一的交互,当模型决定它应该触发某些事件时,相关的视图应该被注册为这些事件的监听器并分别作出反应。
希望这有帮助