使用 Java 的 Swing,您经常需要将元素包装到其他元素中才能实现所需的布局。然而,这些面板的元素确实需要可由 super 面板(进一步称为 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
都必须放置在 View 中。
当然,一种解决方案是将所有元素放入适当的包装类中,然后将其设为 public
+ final
,或者创建无数的 getter 和 setter
.
但是,我确信有一种更漂亮的 OOP 方法来实现这一点?
最佳答案
嗯,我不相信这里有银弹解决方案。
当我使用 Swing 时,我尝试记住以下几点: - 使用封装。将您的面板视为可重复使用的组件。 - 尽可能将数据层与 View 解耦。
当应用于您的问题时,这可能意味着以下内容: - 你的AppUserView面板唯一知道的是2个包装器:elementWrapper和buttonWrapper。这些是“黑匣子”——可重用组件,AppUserView 可以“按原样”使用。 每个“包装器”都有一个关于按钮/文本字段/它需要的任何内容的引用。 数据模型应该与这些 View 完全解耦,唯一的交互应该是通过事件来完成,当模型决定应该触发某些事件时,相关 View 应该注册为这些事件的监听器并分别使用react。
希望这有帮助
关于java - 用于访问子面板元素的更漂亮的解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14306266/