使用 Java RCP 和 SWT 打开一个新的 Window
Opening a new Window with Java RCP and SWT
我目前正在开发一个应用程序,为此,我将 Java RCP 与 SWT 结合使用。
我想要什么:
我有一个 window,当我点击一个按钮时,我需要打开整个 window。 window 完美运行,看起来像这样:
当我按下它时,会打开一个新的 window。看起来像这样:
Window2(是的,中间的图片很重要)
目前是如何完成的:
Window 1 是使用 Application.e4xmi 完成的修剪Window,其中包含一些部件。按钮包含在其中一个部件中。这是它的代码:
@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 的新 class。它的构造函数如下:
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 是单线程的。所以我按照说明进行操作,这是游戏构造函数的另一个版本:
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 : Failed to execute runnable
(java.lang.IllegalArgumentException : Argument cannot be null)
有什么解决办法吗?
提前致谢。
科斯尼鲁
如果您在 Application.e4xmi 的 'Windows and Dialogs' 部分添加一个 Trimmed Window(或只是一个普通的 Window)并关闭 'To Be Rendered'(保持可见on) 然后你可以显示它:
@Inject
EModelService modelService;
@Inject
MApplication app;
MUIElement window = modelService.find("window id", app);
window.setToBeRendered(true);
我目前正在开发一个应用程序,为此,我将 Java RCP 与 SWT 结合使用。
我想要什么:
我有一个 window,当我点击一个按钮时,我需要打开整个 window。 window 完美运行,看起来像这样:
当我按下它时,会打开一个新的 window。看起来像这样:
Window2(是的,中间的图片很重要)
目前是如何完成的:
Window 1 是使用 Application.e4xmi 完成的修剪Window,其中包含一些部件。按钮包含在其中一个部件中。这是它的代码:
@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 的新 class。它的构造函数如下:
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 是单线程的。所以我按照说明进行操作,这是游戏构造函数的另一个版本:
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 : Failed to execute runnable (java.lang.IllegalArgumentException : Argument cannot be null)
有什么解决办法吗?
提前致谢。
科斯尼鲁
如果您在 Application.e4xmi 的 'Windows and Dialogs' 部分添加一个 Trimmed Window(或只是一个普通的 Window)并关闭 'To Be Rendered'(保持可见on) 然后你可以显示它:
@Inject
EModelService modelService;
@Inject
MApplication app;
MUIElement window = modelService.find("window id", app);
window.setToBeRendered(true);