首先,我对SWT非常崭新(非常习惯,但试图分支到其他工具上,并希望对我的应用更具本地的外观和感觉(。抱歉,如果我问明显的问题。
因此,在我的SWT应用程序中,我正在编写一个基本表单(a Shell
(,该表包含一个带有数据库数据的表。
此表格上的Edit
按钮弹出了另一个包含来自选定表行的数据的模态Shell
,并允许用户编辑数据并保存数据。
启动编辑表格的代码:
EditForm frm = new EditForm(this, ...); // (other custom parameters specific to my application)
// should only run AFTER the form is disposed
refresh();
refresh()
方法清除了表格中的所有行,并通过数据库中的更新数据重新填充。
问题是,refresh()
方法在显示EditForm
后立即运行。这告诉我它的行为异步。
EditForm
绝对是模态:
public class EditForm extends Shell {
public EditForm(Shell parent, ...) {
super(Display.getCurrent(), SWT.TRIM | SWT.APPLICATION_MODAL);
}
}
swt Shell
是否通常会像这种模态一样行事异步?有没有一种方法可以"强制"它同步,因此仅在处理EditForm
时才称为refresh()
?
您要寻找的是嵌套读取循环。如果在打开外壳之后放置,并且循环的退出条件是"外壳仍然打开",则刷新代码仅在关闭嵌套外壳后才运行。
例如:
while ( !nestedShell.isDisposed() ) {
if ( !display.readAndDispatch() ) {
display.sleep();
}
}
jface是一个库,可在SWT上提供实用程序和薄薄的抽象。为了构建模态对话框,如果提供具有setBlockOnOpen()
方法的Dialog
类及其子类,以控制阻止行为。不幸的是,它会拖入两个左右的其他库中,但考虑到。