查看不同步更新
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'。
在后台线程中,您可以将 Display
的 asyncExec
或 syncExec
方法用于 UI 线程中的 运行 代码。
有关详细信息,请参阅 Eclipse Jobs and Background Processing
在我继续之前,这是我的 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'。
在后台线程中,您可以将 Display
的 asyncExec
或 syncExec
方法用于 UI 线程中的 运行 代码。
有关详细信息,请参阅 Eclipse Jobs and Background Processing