查看不同步更新

View not updating synchronously

在我继续之前,这是我的 ViewPart class:

public class Exp extends ViewPart {

public static final String ID = "edu.bitsgoa.views.Exp"; //$NON-NLS-1$
public static Text text;

public Exp() {
}

@Override
public void createPartControl(final Composite parent) {

    ScrolledComposite sc = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL);
    Composite composite = new Composite(sc, SWT.NONE);
    sc.setContent(composite);
    composite.setLayout(new GridLayout(2, false));

    text = new Text(composite, SWT.BORDER | SWT.WRAP | SWT.V_SCROLL | SWT.MULTI | SWT.READ_ONLY);
    text.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
    Font newFont=new Font(text.getDisplay(),new FontData("Monospace",10,SWT.NATIVE));
    text.setFont(newFont);

    GridDataFactory.fillDefaults().grab(true, true).hint(400, 400).applyTo(text);
    sc.setExpandHorizontal(true);
    sc.setExpandVertical(true);
    sc.setMinSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT));

    createActions();
    initializeToolBar();
    initializeMenu();
}


private void createActions() {
    // Create the actions
}
private void initializeToolBar() {
    IToolBarManager toolbarManager = getViewSite().getActionBars()
            .getToolBarManager();
}
private void initializeMenu() {
    IMenuManager menuManager = getViewSite().getActionBars()
            .getMenuManager();
}
public void setFocus() {
    // Set the focus
}

}

我创建了这个 class 作为控制台,这样我就可以从我的自定义插件中打印数据。这是我在上面显示数据的方式(这可能是一种非常幼稚的方法,但在某种程度上有效):

public static void display(final String message){
    Display.getDefault().asyncExec(new Runnable() {
        @Override
        public void run() {
            Exp.text.append(message);
            Exp.text.append("\n");
        }
    });
}

这个方法有些不同class。每当我必须在控制台上打印一些东西时,我将此方法称为:

Preparation.display("Calculating parameters...);
calculateParameters();
Preparation.display("Done");

现在,问题是在上面三行中,数据没有打印在控制台上:

Calculating parameters...
(wait for some time, calculate parameters)
Done

而是先计算参数,然后一次打印所有内容,如:

(wait for some time, calculate parameters) 
Calculating parameters...
Done

我希望它同步完成,因为我调用了显示方法。一般来说,我对 SWT 和 Java 图形非常陌生。知道我可能哪里出错了吗?

谢谢!

UI 线程中的长 运行ning 任务将锁定 UI,并且在它完成之前不会更新任何内容。您必须使用后台线程。

由于您阻止了 SWT readAndDispatch 循环,即使您之前完成的操作很长 运行ning 代码启动也可能直到代码结束才发生,因为它们依赖于调度循环。

您可以只使用普通的 Thread 作为后台代码,也可以使用 Eclipse Job。作业允许您更新报告工作进度的 'progress monitor'。

在后台线程中,您可以将 DisplayasyncExecsyncExec 方法用于 UI 线程中的 运行 代码。

有关详细信息,请参阅 Eclipse Jobs and Background Processing