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

Java 在处理SWT模态shell之前运行的进一步代码,java,eclipse,swt,Java,Eclipse,Swt,首先,我对SWT非常陌生,非常习惯Swing,但试图扩展到不同的工具,并希望我的应用程序具有更原生的外观和感觉。如果我问了明显的问题,我会道歉 所以,在我的SWT应用程序中,我正在编写一个基本表单,一个Shell,它有一个包含数据库数据的表 此表单上的编辑按钮弹出另一个模态Shell,其中包含所选表格行中的数据,并允许用户编辑数据并保存 启动编辑表单的代码: EditForm frm = new EditForm(this, ...); // (other custom parameters s

首先,我对SWT非常陌生,非常习惯Swing,但试图扩展到不同的工具,并希望我的应用程序具有更原生的外观和感觉。如果我问了明显的问题,我会道歉

所以,在我的SWT应用程序中,我正在编写一个基本表单,一个Shell,它有一个包含数据库数据的表

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

启动编辑表单的代码:

EditForm frm = new EditForm(this, ...); // (other custom parameters specific to my application)
// should only run AFTER the form is disposed
refresh();
refresh方法清除表中的所有行,并使用数据库中更新的数据重新填充表

问题是,只要显示EditForm,刷新方法就会运行。这告诉我它的行为是异步的

EditForm绝对是模态的:

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

SWT外壳对象是否通常会像这样异步运行,即使它们是模态的?有没有一种方法可以强制它是同步的,这样只有在释放EditForm时才会调用refresh?

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

例如:

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

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

所有SWT小部件,包括Shell,都不应该被子类化,请参见JavaDoc。我建议您相应地修改代码。另外,您调用的超级构造函数可能存在错误。我想你想要超级家长。。。而不是super Display.getCurrent。哈,真奇怪。我选择从File>new>Other菜单创建一个新的Shell,它生成了自动扩展Shell的类头。我看到过关于在其他类中不进行子类化的注释,但不记得在Shell中看到过它。奇怪的编辑:我想知道,如果这些类不是子类,为什么它们不把它们作为最终类。SWT是一个很好的概念,但它感觉像是一个非常破碎/未开发的API,尤其是在跨平台行为方面。使类成为最终类是一个非常困难的方法。SWT故意反对final,以允许子类化作为最后手段。例如,您可以通过覆盖某个方法来解决bug。当然,UI设计工具违反其生成代码的工具包的基本规则是很不幸的。出于好奇,您觉得哪些地方被破坏/开发不足?好的,谢谢您提供的信息。我求助于使用本机开发语言/库,例如Windows上的.NET,Mac上的Xcode,但如果我回到SWT,我会记住这一点。