如何用方法替换Display#asyncExec(Runnable)?

时间:2013-11-28 08:39:23

标签: java swt eclipse-rcp

我有很多重复行的代码如下所示。如何将其作为方法?

Display.getDefault().asyncExec(new Runnable() {
    @Override
    public void run() {
        ....
    }
});

2 个答案:

答案 0 :(得分:1)

好的,为了让这个更加突出,让我发一个答案:

你所拥有的代码尽可能短,因为你可以传递给方法的唯一东西是变量或标量。


对于您对Display#asyncExec(Runnable)的所有通话都相同的特殊情况,您可以执行以下操作:

public class MyClass implements Runnable
{
    public void myMethod()
    {
        /* Your other code here */
        Display.getDefault().asyncExec(this);
    }

    @Override
    public void run()
    {
        /* Update the GUI here */
    }
}

另一种替代方法是为每个GUI更新目的创建类,每个实现Runnable

public class GuiUpdaters
{
    public static class TableViewerUpdater implements Runnable
    {
        @Override
        public void run()
        {
            /* Update your TableViewer here */
        }
    }

    public static class StatusBarUpdater implements Runnable
    {
        @Override
        public void run()
        {
            /* Update your Status bar here */
        }
    }
}

你可以这样称呼它们:

/* Update the TableViewer */
Display.getDefault().asyncExec(new TableViewerUpdater());

/* Update the status bar */
Display.getDefault().asyncExec(new StatusBarUpdater());

答案 1 :(得分:0)

当不需要参数时,您还可以创建绘图例程的单个实例:

final Runnable tableDrawer = new Runnable()
{
    @Override
    public void run()
    {
        /* Update your TableViewer here */
    }
};

然后在代码中,只需使用:

Display.getDefault().asyncExec(tableDrawer);

一些优化方法:如果您已经在displaythread中,可以自己调用run方法 - 否则,运行asyncExec。

您可以创建一个帮助程序类来运行这些类型的任务。帮助程序类可以检查您是否进入显示线程,跟踪绘图例程的使用次数,并在绘图任务执行时间过长时提醒您。 (超过1000毫秒的任何东西都可能不是一件好事,应该包含在进度对话框中。)

如果您正在进行大量GUI更新,请对它们进行分组,以便在单个绘图“runnable”事件中尽可能多地执行此操作。例如,如果您正在向控制台绘制文本行,请不要为每行文本绘制一行,而是使用需要绘制的ArrayList行..然后在list.size时触发绘制()== 1。当要显示许多文本行时,加速将是戏剧性的。