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

时间:2017-05-04 01:06:27

标签: java eclipse swt

首先,我对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

1 个答案:

答案 0 :(得分:1)

您正在寻找的是嵌套的读取和分派循环。如果在打开shell之后放置它,并且循环的退出条件是'shell仍然打开',则刷新代码将仅在嵌套shell关闭后运行。

例如:

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

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