Java SWT:包装syncExec和asyncExec以清理代码

jon*_*scb 5 java user-interface swt

我有一个使用SWT作为工具包的Java应用程序,我厌倦了更新GUI元素所需的所有丑陋的样板代码.

只是要设置一个禁用按钮启用我必须经历这样的事情:

shell.getDisplay().asyncExec(new Runnable() {
    public void run() {
        buttonOk.setEnabled(true);
    }
});
Run Code Online (Sandbox Code Playgroud)

我更喜欢保持我的源代码尽可能平坦,但我需要一个高达3个缩进级别来做一些简单的事情.

有什么方法可以包装吗?我想要一个类:

public class UIUpdater {
    public static void updateUI(Shell shell, *function_ptr*) {
        shell.getDisplay().asyncExec(new Runnable() {
           public void run() {
              //Execute function_ptr
           }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

并且可以像这样使用:

UIUpdater.updateUI(shell, buttonOk.setEnabled(true));
Run Code Online (Sandbox Code Playgroud)

像这样的东西对于隐藏SWT似乎认为有必要做任何事情的可怕混乱都是很好的.

据我了解,Java不能做函数指针.但Java 7将有一个名为Closures的东西应该是我想要的.但与此同时,我可以做任何事情来将函数指针或回调传递给另一个要执行的函数吗?

顺便说一句,我开始认为在Swing中重做这个应用程序是值得的,而且我不必忍受这个丑陋的垃圾和SWT的非跨平台性.

Gil*_*anc 4

我的 SWT 代码中也有类似的问题。

我编写了一个基类,它只有 asyncExec 和syncExec 方法。对于我想要调用的每个 GUI 方法,我都有一个方法。

我的非 GUI 线程类扩展了基类。

所以在非 GUI 线程类中,我会进行如下调用setEnabled(shell, true)

在基类中,我定义了一个public void setEnabled(Shell shell, boolean flag)方法,其中包含第一个示例中的代码。