【发布时间】:2022-01-27 05:15:17
【问题描述】:
我目前正在用 Java 制作一个阅读应用程序,这是my main menu。
我想要的是,当我在选择一本书后按下底部按钮时,会打开另一个带有该书的窗口。我现在所做的是一个功能,它会在关闭我当前所在的窗口的同时打开另一个窗口以释放一点内存。 在从中检索到必要的信息(书的索引)后,我首先关闭当前窗口,如下所示:
btnOuvrirLeLivre.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
int index = list.getSelectionIndex();
LiseuseController controller = new LiseuseController(null, null);
parent.dispose();
controller.viewBookController(index);
}
});
(我的项目使用的是MVC方法),parent只是用于打开框架的复合体。
public void viewBookController(int index) {
Display displayBook = new Display();
Shell shellBook = new Shell(displayBook);
shellBook.setLayout(new GridLayout(1, false));
index += 250;
LiseuseView lecture = new LiseuseView(shellBook, SWT.NONE, index);
shellBook.pack();
shellBook.open();
while(!shellBook.isDisposed()) {
if(!displayBook.readAndDispatch())
displayBook.sleep();
}
displayBook.dispose();
}
索引只是我数据库中的书号,一切都应该没问题,但是在按下按钮打开书后执行此操作时出现此错误:
Exception in thread "main" org.eclipse.swt.SWTException: Invalid thread access
at org.eclipse.swt.SWT.error(SWT.java:4875)
at org.eclipse.swt.SWT.error(SWT.java:4790)
at org.eclipse.swt.SWT.error(SWT.java:4761)
at org.eclipse.swt.widgets.Display.checkDisplay(Display.java:824)
at org.eclipse.swt.widgets.Display.create(Display.java:887)
at org.eclipse.swt.graphics.Device.<init>(Device.java:126)
at org.eclipse.swt.widgets.Display.<init>(Display.java:563)
at org.eclipse.swt.widgets.Display.<init>(Display.java:554)
at Controller.LiseuseController.viewBookController(LiseuseController.java:133)
at View.LiseuseHome$4.widgetSelected(LiseuseHome.java:81)
at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:252)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:89)
at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4209)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1037)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4026)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3626)
at Controller.LiseuseController.viewController(LiseuseController.java:126)
at Main.Main.main(Main.java:59)
(LiseuseController.java:133) 包含“Display displayBook = new Display();”
并且 (LiseuseController.java:126) 包含
if(!display.readAndDispatch())
display.sleep();
这是用于打开第一个窗口的另一个函数。
我真的不明白是什么导致了这个错误,我不能像使用 Jframe 一样将一个置于“可见”而另一个置于“不可见”,因为这两个窗口位于 2 个不同的 .java 上文件。
你知道如何解决这个问题吗?
【问题讨论】:
-
您应该只在应用程序启动时创建一个
Display。此外,您必须在单个主线程上执行 所有 UI 操作,看起来您正在尝试为 UI 使用多个线程。仅凭一些代码很难说更多。
标签: java eclipse user-interface swt