Java GWT MVP:连接演讲者、活动、显示器上的点;地点
我正在尝试设计我的第一个超级简单的GWT应用程序,它利用了GWT的大多数主要API特性。我想我已经完成了70-80%的工作,但是在浏览了大量的GWT文档、无数的文章,并在这里发布了许多其他与GWT相关的问题之后,我仍然很难理解最后20-30%的工作是什么 我已经调用了第一个测试应用程序Java GWT MVP:连接演讲者、活动、显示器上的点;地点,java,gwt,mvp,gwt-activities,gwt-places,Java,Gwt,Mvp,Gwt Activities,Gwt Places,我正在尝试设计我的第一个超级简单的GWT应用程序,它利用了GWT的大多数主要API特性。我想我已经完成了70-80%的工作,但是在浏览了大量的GWT文档、无数的文章,并在这里发布了许多其他与GWT相关的问题之后,我仍然很难理解最后20-30%的工作是什么 我已经调用了第一个测试应用程序ClickItToWinIt,我希望它看起来像这样: 当用户单击“Win”按钮时,左侧的图像框中会弹出一张图片(Win pic.png)。当用户单击“丢失”按钮时,同一帧中会弹出一张图片(Lose pic.png
ClickItToWinIt
,我希望它看起来像这样:
当用户单击“Win”按钮时,左侧的图像框中会弹出一张图片(Win pic.png
)。当用户单击“丢失”按钮时,同一帧中会弹出一张图片(Lose pic.png
)。用户可以在按钮之间来回单击以显示不同的图片。这将是一个单页应用程序,在我的机器上本地托管,只需要包含一个主页、一个模块/入口点等
请注意对于这样一个简单的ClickItToWinIt
app来说,下面提出的打包/类结构肯定是过火了。然而,不久之后,我想用GWT做更多更好的事情,所以在我开始使用更复杂的UI处理更大的应用程序之前,了解正确的GWT编码对我来说很重要
此外,以下提议的结构基于谷歌似乎不懈鼓励的3项GWT原则:
- 表现;客户端速度
- 保安
- 分离关注点(MVP等),便于测试
normal styles.css
”文件,使网站看起来“正常”,但也有一个“facebook styles.css
”文件,使网站具有facebook的外观(颜色、字体等),等等,我想在这里完成同样的事情,并提出一个net.bfodder.c2w.client.views.themes
包,其中将包含AbstractTheme
子类。这些子类在构建时会以某种方式注入/烘焙到视图/演示器中,并为我提供了一种使用不同主题或外观部署应用程序的方法。我相信这是正确的方法,因为(如果我对ClientBundle
和CssResource
的理解是正确的)GWT似乎将对象化CSS样式转换为GWT POJO。我的AbstractTheme
子类将以某种方式与CssResource
绑定,并为我的所有小部件定义样式
下面是建议的src/main/java
结构ClickItToWinIt
(我正在使用谷歌Eclipse插件在Eclipse3.7Indigo中开发):
AppController
用于任何不属于任何特定IPresenter
子类的古怪应用程序级业务逻辑。main模块
是一切开始的地方(DI、开始初步的活动
等)。按钮放在ButtonContainer
中,ImageViewer
放在ImageContainer
中,这两个内部容器都放在maincainer
中(我假设它是在MainModule
中创建的)。至于这些UI组件的布局和样式,就像我说的,这将取决于注入/配置的AbstractTheme
在其规则集中定义的内容
我正在使用推荐的ClientFactory
,以方便访问应用程序GWT管道的主要部分
至于MVP“东西”,我是这么想的:
public class WinActivity extends AbstractActivity {
private final ClientFactory clientFactory;
private final WinPlace place;
public WinActivity(ClientFactory clientFactory, WinPlace place) {
this.clientFactory = clientFactory;
this.place = place;
}
@Override
public void start(AcceptsOneWidget panel, EventBus eventBus) {
ImagePresenter presenter = clientFactory.getImagePresenter();
// Inject the presenter with any stateful data here
// presenter.setImage(getWinImageUri());
presenter.go(panel);
}
}
问题!
正如我上面所说的,我相信我就快到了,我只是在一些事情上很难弥合差距。所以我问:
如何连接我的AbstractTheme
子类以使用CssResource
和ClientBundle
,以便我的应用程序被注入/配置正确的主题,并且客户端浏览器下载正确的CSS文件(normal style.CSS
或facebook style.CSS
)
有人能正确地解释一下i呈现者
(来自经典MVP)、AbstractActivity
、“显示区域”(AcceptsOneWidget
)和Place
之间的关系吗?这里是否存在1对1对1的关系,或者GWT是否打算为每个抽象活动
,或者其他一些比率设置多个显示区域
如何将WinPlace
与GWT的历史API连接?因此,如果用户单击WinButton
,LoseButton
,WinButton
,如何将其保存在浏览器历史记录中,以便他们可以点击前/后浏览器按钮并反复重新创建此使用模式
单击WinButton
时,它会在事件总线上放置一个some click事件。在何处以及如何将处理程序/侦听器连接到事件总线,该事件总线将知道:(a)在ImageViewer
中更改图像,以及(b)在历史API中存储此状态更改
我从中得到了关于AppController
的想法,不幸的是,它从未提供任何关于AppController
实际外观的代码片段。任何人(熟悉GWT的AppController
模式的人)都能解释一下这是什么样子吗?也许它是一个IPresenter
子类,没有特定的活动
或视图组件
总的来说,我知道这种“氨基硝酸盐”式的问题是不被鼓励的,但我必须问任何在战场上的GWT老兵:我在这里离基地太远了,还是我或多或少地走上了GW的轨道
public class WinActivity extends AbstractActivity {
private final ClientFactory clientFactory;
private final WinPlace place;
public WinActivity(ClientFactory clientFactory, WinPlace place) {
this.clientFactory = clientFactory;
this.place = place;
}
@Override
public void start(AcceptsOneWidget panel, EventBus eventBus) {
ImagePresenter presenter = clientFactory.getImagePresenter();
// Inject the presenter with any stateful data here
// presenter.setImage(getWinImageUri());
presenter.go(panel);
}
}