o**2 发帖数: 168 | 1 上周 cplus2009 同学有个问题(http://www.mitbbs.com/article_t/Programming/31253813.html),涉及到GUI程序中线程之间转换的问题。就是controls都要在UIthread(Swing或SWT)里操作,而后台的logic要在非UIthread里操作。
我当时说了FMP可以轻易淘汰掉这种thread-base的编程技术,于是趁这个长周末,把对
UIthread的支持做进了FMP。想要试用的,可以在此download 2.0 jar:https://
github.com/fastmessenger/RI-in-Java/blob/master/fmp-2.0-bin.jar?raw=true
这里我借用 cplus2009 同学的问题作为范例:他的问题是有一个界面,上面有一个
BROWSE按钮,按了后弹出一个文件选择对话框。用户选好文件后,将文件名显示在
BROWSE按钮前面的text里。这里文件选择用来代表后台的耗时操作。
用FMP的,可以这样设计:一个Frontend class用来access UI controls,包括文件名
text,browse按钮等;另一个Backend class用来做后台耗时操作,这里用文件选择框
来代表。
public class Frontend {
// UI thread
void renderUI () {
}
// UI thread
void fileNameReady (String name) {
}
}
public class Backend {
// none UI thread
void selectFile () {
}
}
在运行时,要做一些准备,放哪里都行:
Frontend fr = new Frontend();
Backend bk = new Backend();
...
SwtMessenger messenger = new SwtMessenger(display); //display用来确定
UIthread
messenger.registerSwtReceiver(fr, "ui", "fileNameReady"); //FMP保证fr只会被
UIthread回调
messenger.registerReceiver(bk, "back", "selectFile"); //FMP保证fr只会被
nonUIthread回调
...
fr.setMessenger(messenger);
bk.setMessenger(messenger);
Frontend 和 Backend 里都需要有messenger的reference,因为运行中要用到。现在在
回过头来把这两个class补充完整:(不需要callService(),用sendMessage()就可以
了,因为不需要返回值,也不关心具体什么时候对方收到和执行完毕。)
public class Frontend {
// UI thread
void renderUI () {
...
button.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
messenger.sendMessage("back:selectFile");
}
}
}
// UI thread
void fileNameReady (String name) {
text.setText(name);
}
}
public class Backend {
// none UI thread
void selectFile () {
...open file selector and obtain filename
messenger.sendMessage("ui:fileNameReady", filename);
}
}
不论是从OO设计、还是concurrent设计,说FMP在这里胜出应该没有问题吧。 | z*******3 发帖数: 13709 | 2 大牛你考虑一下上javafx的api接口吧
swing和swt都有些过气了
当年java在这两个ui年代,貌似都做得不太好
据说两个领导都是女的,女人当权,容易乱搞 | o**2 发帖数: 168 | 3 这不是柿子挑软的捏嘛...
SWT是小众产品;Swing在东部倒是用来开发了不少trading系统的前台。老实说,这两
个从来都没有火过就有些过气了。
这个JavaFX刚出来,我还不了解,也不知道有没有人用,有空看看。 | o**2 发帖数: 168 | 4 多谢老赵的提醒 (看见有人叫“老赵”,估计是你了,我就跟着叫了)
这个JavaFX和Swing的UI thread设计几乎是一样的,所以我就把对这三个GUI系统的支
持都做到一起了。
public class GuiMessenger extends Messenger {
private Display swtDisplay;
public GuiMessenger () {
super ();
}
public GuiMessenger (ExecutorService executorService) {
super (executorService);
}
public Display getSwtDisplay () {
return swtDisplay;
}
public void setSwtDisplay (Display swtDisplay) {
this.swtDisplay = swtDisplay;
}
synchronized public void registerJavaFxReceiver (Object implObj, String
receiver, String... services) {
registerReceiverImpl (ReceiverType.JavaFX, new Object[] { implObj },
receiver, services);
}
synchronized public void registerSwingReceiver (Object implObj, String
receiver, String... services) {
registerReceiverImpl (ReceiverType.Swing, new Object[] { implObj },
receiver, services);
}
synchronized public void registerSwtReceiver (Object implObj, String
receiver, String... services) {
registerReceiverImpl (ReceiverType.SWT, new Object[] { implObj },
receiver, services);
}
} | z*******3 发帖数: 13709 | 5 过奖
您还可以考虑用maven来发布您的这个项目
这样便于我们找到您的jars
【在 o**2 的大作中提到】 : 多谢老赵的提醒 (看见有人叫“老赵”,估计是你了,我就跟着叫了) : 这个JavaFX和Swing的UI thread设计几乎是一样的,所以我就把对这三个GUI系统的支 : 持都做到一起了。 : public class GuiMessenger extends Messenger { : private Display swtDisplay; : public GuiMessenger () { : super (); : } : public GuiMessenger (ExecutorService executorService) { : super (executorService);
| o**2 发帖数: 168 | 6 这个在我的TODO list上都好几个月了,你不提,还真说不定要再过几个月才想得起来
。刚在 sonatype.org 上开了帐号和ticket,要等等。他们说:Normally it takes
less than 2 business days.
不过group id什么的现在可以定好了:
groupId: com.fastmessenger
artifactId: fmp-ref-impl
version: 2.0.0
【在 z*******3 的大作中提到】 : 过奖 : 您还可以考虑用maven来发布您的这个项目 : 这样便于我们找到您的jars
|
|