gpt4 book ai didi

java - 使用 Java RCP 和 SWT 打开新窗口

转载 作者:行者123 更新时间:2023-11-30 06:53:32 26 4
gpt4 key购买 nike

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

我想要什么:

我有一个窗口,当我单击一个按钮时,我需要打开整个窗口。该窗口工作完美,如下所示:

Window1

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

Window2 (是的,中间的图片有它的重要性)

目前是如何完成的:

窗口 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 是单线程的。所以我按照说明进行操作,这是游戏构造函数的另一个版本:

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 ();
}
});
}

新问题来了:在此之后我无法调用图像(因此我在窗口 2 上显示了图片)。因为 Image (SWT) 需要构造一个显示,并且如果没有 Runnable 实例,显示就无法正常工作,因此在此之后我无法使用图像。我在这里需要我的图像(以及此后的其他地方)。

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

org.eclipse.swt.SWTException : Failed to execute runnable (java.lang.IllegalArgumentException : Argument cannot be null)

请问大家有什么解决办法吗?

提前致谢。

科斯尼鲁。

最佳答案

如果您将修剪窗口(或只是一个普通窗口)添加到 Application.e4xmi 的“窗口和对话框”部分,并关闭“待渲染”(保持可见状态),则可以使用以下命令显示它:

@Inject
EModelService modelService;
@Inject
MApplication app;


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

window.setToBeRendered(true);

关于java - 使用 Java RCP 和 SWT 打开新窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42256476/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com