首先,我对SWT非常陌生(非常习惯Swing但是尝试扩展到不同的工具,并希望我的应用程序具有更原生的外观和感觉)。如果我提出明显的问题,请道歉。
因此,在我的SWT应用程序中,我正在编写一个基本表单(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
对象通常是否像这样异步运行,即使它们是模态的?有没有办法强迫"强迫"它是同步的,只有在refresh()
被处理时才会调用EditForm
答案 0 :(得分:1)
您正在寻找的是嵌套的读取和分派循环。如果在打开shell之后放置它,并且循环的退出条件是'shell仍然打开',则刷新代码将仅在嵌套shell关闭后运行。
例如:
while ( !nestedShell.isDisposed() ) {
if ( !display.readAndDispatch() ) {
display.sleep();
}
}
JFace是一个通过SWT提供实用程序和精简抽象的库。要构建模态对话框,if提供Dialog
类及其具有setBlockOnOpen()
方法的子类来控制阻塞行为。不幸的是,它拖入了两个左右的其他库,但它的方式是考虑。