使用Java RCP和SWT打开一个新窗口

时间:2017-02-15 17:40:14

标签: java swt rcp e4

我正在开发一个应用程序,为此,我正在使用Java RCP和SWT。

我想要的是什么:

我有一个窗口,当我点击一个按钮时,我需要打开一个整个窗口。窗口效果很好,看起来像这样:

Window1

当我按下它时,会打开一个新窗口。它看起来像这样:

Window2(是的,中间的pic有其重要性)

目前的工作方式:

窗口1是使用Application.e4xmi完成的TrimmedWindow,其中包含一些部件。该按钮包含在其中一个部件中。这是它的代码:

@PostConstruct
public void postConstruct(Composite parent) {
    Button b = new Button(parent, SWT.BORDER);  
    b.setText("Press me !");
    b.addListener(SWT.Selection, new Listener() {

        @Override
        public void handleEvent(Event event) {
            parent.getShell().dispose();
            new Game(Display.getCurrent());
        }
    });
}

正如您所看到的,Window 2是一个名为Game的新类。它的构造函数如下:

public Game(Display display) {
    this.display = display;
    this.shell = new Shell(this.display);
    this.setData();
    shell.setText("I don't work properly");
    shell.setMinimumSize(800, 600);

    this.buildUI();

    shell.pack();
    shell.open();

    while (!shell.isDisposed()) {
        if (!this.display.readAndDispatch ()) this.display.sleep ();
    }
    this.display.dispose ();
}

有什么问题? :

当我使用Eclipse启动项目时,一切都很顺利。我的意思是,真的。我点击,它打开,它加载,耶!但是之后的想法是我将项目导出为可执行文件。所以我这样做。这是我的.exe文件。让我们开始吧。它不起作用。当我按下按钮时,没有任何反应。甚至没有错误信息,没有。

我找到了一些解决方案,说问题来自显示器,因为RCP是单线程的。所以我按照说明操作,这是Game构造函数的另一个版本:

public Game() {
    this.display = Display.getDefault();
    this.display.asyncExec(new Runnable() {

        @Override
        public void run() {
            shell = new Shell(display);
            setData();
            shell.setText("I work better but...");
            shell.setMinimumSize(800, 600);

            buildUI();

            shell.pack();
            shell.open();

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

所以这里出现了新的问题:在此之后我无法调用图像(因此我在Window 2上显示的图片)。因为Image(SWT)需要构建一个显示,并且因为没有Runnable实例,显示不能很好地工作,所以在此之后我不能使用图像。我需要我的形象(以及此后的其他地方)。

编辑:在这种情况下我有一条错误消息。它说:

  

org.eclipse.swt.SWTException:无法执行runnable   (java.lang.IllegalArgumentException:Argument不能为null)

有什么解决方案吗?

提前致谢。

Kosnyru。

1 个答案:

答案 0 :(得分:1)

如果您在“Windows和对话框”中添加了一个修剪窗口(或只是一个普通窗口)。 Application.e4xmi的“要渲染的部分”#39;关闭(保持Visible开启),然后您可以使用以下方式显示它:

@Inject
EModelService modelService;
@Inject
MApplication app;


MUIElement window = modelService.find("window id", app);

window.setToBeRendered(true);