处理 SWT 模态 shell 之前的进一步代码 运行

Further code running before SWT modal shell is disposed

首先,我是 SWT 的新手(非常习惯 Swing,但试图扩展到不同的工具,并希望我的应用程序具有更原生的外观和感觉)。抱歉,如果我问的是显而易见的问题。

因此,在我的 SWT 应用程序中,我正在编写一个基本表单(Shell),其中有一个 table 以及来自数据库的数据。

此表单上的 Edit 按钮会弹出另一个模态 Shell,其中包含来自所选 table 行的数据,并允许用户编辑数据并保存它。

启动编辑表单的代码:

EditForm frm = new EditForm(this, ...); // (other custom parameters specific to my application)
// should only run AFTER the form is disposed
refresh();

refresh() 方法清除 table 中的所有行,并使用数据库中的更新数据重新填充它。

问题是,一显示EditFormrefresh()方法就是运行。这告诉我它的行为是异步的。

EditForm绝对是模态的:

public class EditForm extends Shell {
    public EditForm(Shell parent, ...) {
        super(Display.getCurrent(), SWT.TRIM | SWT.APPLICATION_MODAL);
    }
}

SWT Shell 对象通常会像这样异步运行吗,即使它们是模态的?有没有办法让 "force" 同步,这样 refresh() 只在 EditForm 被处理时调用?

您正在寻找的是嵌套的读取和调度循环。如果那个放在shell打开之后,循环的退出条件是'shell is still open',那么刷新代码只会在嵌套的shell关闭后才会是运行 .

例如:

while ( !nestedShell.isDisposed() ) {
  if ( !display.readAndDispatch() )  {
    display.sleep();
  }
}

JFace 是一个通过 SWT 提供实用程序和精简抽象的库。要构建模态对话框,如果提供 Dialog class 及其子 class 具有 setBlockOnOpen() 方法来控制阻塞行为。不幸的是,它拖入了两个左右的其他库,但要考虑一下。