小编典典

java / gwt UI编码-干净的代码

java

我已经开始使用gwt进行一些基本的Java编码,而我有点担心主类的繁重。

例如-
如何分隔密钥处理程序,因为它们触发了UI的许多更改,我如何才能将其移到单独的.class文件中,并且仍然能够访问主类中的所有各种小部件,而不必将所有内容传递给处理程序(即,我在click事件之后处理的所有小部件)。

我已经在Google上搜索过,但是没有遇到任何特别好的例子-
知道我可以阅读的任何易读的代码库,看看应该如何做?(gwt自己的tut非常简单,只需将所有内容整理到一个文件中)

谢谢!


阅读 215

收藏
2020-11-16

共1个答案

小编典典

我讨厌说些没什么想像力的东西,但是MVC可以工作-它不是最终的工具,但是它可以使您有条理。

编辑:在搜索一个半相关的主题时,我碰到一个类似的想法,但会更详细。

就GWT而言,这意味着您应该考虑将GUI组件放在一个类中,将所有事件处理放在第二个类中,并将对象模型对象与其他两个对象分开。

实现此目的的一种方法是将GUI上的大多数或所有控件公开。这听起来有些la脚,但是它们的用法封装在控制器内部,所以这并不是您具有不可控制的访问权限-
实际上,与所有成员都是私有的相比,访问权限的定义更清晰/定义更好,但是您的视图代码与控制器结合在一起。

具体技巧:

让听众成为他们自己的班级。您经常可以重用它们-
换句话说,避免使用匿名内部类。我有时会创建一个侦听器类,并为每个按钮/控件实例化一个新实例,这些按钮/控件在按下时需要具有相似的效果。如果我需要它对给定的按钮采取一些稍有不同的操作,则将某些内容传递给“特殊”处理程序的构造函数,以便他们知道某些不同的操作。如果需要,您还可以创建不同的处理程序子类-
我只是说不要忘记事件处理程序是类,可以使用继承,并且在需要时可以使用所有内容。

我很久以前学过的一个非常古老的GUI技巧,不要让各种微型处理程序以不同的方式修改GUI,而是让所有“活动”按钮和控件在GUI中设置状态,然后调用一个方法来将该状态应用于GUI上的所有控件。当您超越普通的GUI时,这可能会节省生命。如果不清楚,请发表评论,并为您提供示例。

属性表:

GUI有一个特例-
属性表样式GUI。我已经做了很多这些,它们使人为地狱而烦恼。它们往往具有数十或数百个控件,每个GUI控件往往都绑定到模型中的特定字段,并且只有几百行复制和粘贴样板代码连接它们,每组都复制并粘贴了几行项目已更改-
每个控件至少需要3行代码(创建控件,复制值输入和复制值输出)。

我总是使用“智能”控制器编写这些代码,该控制器可以智能地将控件绑定到某些数据,而无需任何唯一代码。这可能会很棘手,如果这是您的问题,请在评论中让我知道,我可以为您提供一些可能会尝试的技巧的一般建议。我已经从最小的反射解决方案变成了基于XML的完整解决方案。如果我要再做一次,我可能会考虑基于注释。


MVC的示例:

注意,这只是一个示例,有数百万种方法可以执行MVC。

在您的MAIN中:

  • 实例化MyView
  • 实例化MyModel
  • 实例化MyController(myView,myModel)
  • myView.setVisible(true)

在我看来

  • 可能会扩展框架
  • 大多数组件都是public final(public final Button b = new Button())
  • 如果公共成员使您感到紧张,请使用吸气剂-与公共最终成员具有完全相同的效果,只需要一点额外的语法。
  • 请记住,您可以在构造函数中设置最终成员。
  • 可能具有诸如reset()之类的常规方法,但是MyController可能是一个更好的选择。

在MyController中

  • 保存对myView和myModel的引用
  • 在必要时将侦听器添加到myView中(请参阅上面有关侦听器的建议)
  • 根据myModel的状态配置myView
  • 当按下“完成”按钮时,将状态从myView复制到myModel
  • 通知myModel数据已更新并自行销毁。

在MyModel中:

这将是一个典型的模型类,它将包含您的业务逻辑(通常不用作GUI的一部分,这更像是MyController中的GUI逻辑。控制器倾向于在您的业务逻辑中设置值,然后调用诸如update(
),以使某些业务逻辑获得控制。它不应该知道GUI,这是您的“纯”业务类。

有时,GUI可能会调用update()或其他方法来触发一些数据更改,然后从模型中重新加载GUI控件-
这是一种在您的模型不了解GUI的情况下将业务逻辑与GUI集成的相当不错的方法…

而且,正如我上面所说的,如果我使用属性表,我会在MyController中投入更多的工作,这是因为如果您不聪明,那么最终会得到大量的样板行。

请注意,View和Controller几乎总是配对。您不能只用Web视图替换Swing视图并期望控制器保持不受干扰-
但是对于视图或控制器,模型永远都不应更改。

2020-11-16