Java 获得;SWERROR:未实施[多个显示]”功能;使用简单的代码示例

Java 获得;SWERROR:未实施[多个显示]”功能;使用简单的代码示例,java,eclipse,swt,Java,Eclipse,Swt,我正在完成“Eclipse4插件开发示例初学者指南”中的练习。我进入了标题为“操作时间–向托盘添加项目”的部分,当我运行测试实例时,我开始看到类似这样的错误: org.eclipse.swt.SWTError: Not implemented [multiple displays] at org.eclipse.swt.SWT.error(SWT.java:4308) at org.eclipse.swt.widgets.Display.checkDisplay(Display.java:760

我正在完成“Eclipse4插件开发示例初学者指南”中的练习。我进入了标题为“操作时间–向托盘添加项目”的部分,当我运行测试实例时,我开始看到类似这样的错误:

org.eclipse.swt.SWTError: Not implemented [multiple displays]
at org.eclipse.swt.SWT.error(SWT.java:4308)
at org.eclipse.swt.widgets.Display.checkDisplay(Display.java:760)
at org.eclipse.swt.widgets.Display.create(Display.java:896)
at org.eclipse.swt.graphics.Device.<init>(Device.java:157)
更新

当尝试创建多个“Display”对象时,似乎会发生这种情况,因此我在Display类的两个构造函数中设置了一个断点

在Activator类中调用“Display.getDefault()”时,我遇到了断点,但在“start”方法完成后,我也遇到了断点,堆栈如下:

Thread [main] (Suspended (breakpoint at line 500 in Display))   
    Display.<init>(DeviceData) line: 500    
    Workbench.createDisplay() line: 714 
    PlatformUI.createDisplay() line: 161    
    IDEApplication.createDisplay() line: 153    
    IDEApplication.start(IApplicationContext) line: 95  
    EclipseAppHandle.run(Object) line: 196  
    EclipseAppLauncher.runApplication(Object) line: 110 
    EclipseAppLauncher.start(Object) line: 79   
    EclipseStarter.run(Object) line: 344    
    EclipseStarter.run(String[], Runnable) line: 179    
    NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]  
    NativeMethodAccessorImpl.invoke(Object, Object[]) line: 57  
    DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43  
    Method.invoke(Object, Object...) line: 606  
    Main.invokeFramework(String[], URL[]) line: 622 
    Main.basicRun(String[]) line: 577   
    Main.run(String[]) line: 1410   
    Main.main(String[]) line: 1386  
Thread[main](挂起(显示中第500行的断点))
显示。(DeviceData)行:500
Workbench.createDisplay()行:714
PlatformUI.createDisplay()行:161
IDEApplication.createDisplay()行:153
IDEApplication.start(IAApplicationContext)行:95
日食幻影。运行(对象)行:196
EclipseAppLauncher.runApplication(对象)行:110
日食开始(对象)行:79
日食启动程序运行(对象)行:344
EclipseStarter.run(字符串[],可运行)行:179
NativeMethodAccessorImpl.invoke0(方法、对象、对象[])行:不可用[本机方法]
NativeMethodAccessorImpl.invoke(对象,对象[])行:57
DelegatingMethodAccessorImpl.invoke(对象,对象[])行:43
调用(对象,对象…)行:606
Main.invokeFramework(字符串[],URL[])行:622
Main.basicRun(字符串[])行:577
Main.run(字符串[])行:1410
Main.Main(字符串[])行:1386
当我从这个断点恢复时,我看到了“多次显示”错误。因此,这个错误不会发生在我的类中,它会发生在稍后创建另一个显示时

更新

在继续本书中的练习时,我在自定义视图的“createPartControl()”方法中遇到了另一段调用“Display.getDefault()”的代码。我想知道这里会发生什么。使用两个显示构造函数中的现有断点,以及“getDefault()”中的断点,并注释掉“Activator”类中有问题的代码,在启动测试实例时我看到的是,对显示构造函数的第一次调用就在这之前的stacktrace中,来自“IDEApplication.createDisplay()”。之后,它进入了我的视图创建,但是对“Display.getDefault()”的调用没有创建新的显示,因为它已经存在


从目前为止我所看到的情况来看,将代码放在调用“Display.getDefault()”的bundle activator类中似乎不是一个好主意,因为当IDEApplication完全启动时,它将强制创建一个显示,这将失败。

插件设置如何运行activator
start
方法?这通常不会运行,直到插件中的其他东西执行。在Eclipse创建单一显示之前,插件似乎运行得太快了。在类本身之外,我可以找到的对这个“Activator”类的唯一引用是在MANIFEST.MF文件中,作为“Bundle Activator”属性的值。当我在“start”中设置断点时,它从“BundleContextImpl”调用,如果有帮助的话,你找到解决办法了吗?我也遇到了类似的问题。如何设置插件来运行Activator
start
方法?这通常不会运行,直到插件中的其他东西执行。在Eclipse创建单一显示之前,插件似乎运行得太快了。在类本身之外,我可以找到的对这个“Activator”类的唯一引用是在MANIFEST.MF文件中,作为“Bundle Activator”属性的值。当我在“start”中设置断点时,它从“BundleContextImpl”调用,如果有帮助的话,你找到解决办法了吗?我也面临着类似的问题。
Thread [main] (Suspended (breakpoint at line 500 in Display))   
    Display.<init>(DeviceData) line: 500    
    Workbench.createDisplay() line: 714 
    PlatformUI.createDisplay() line: 161    
    IDEApplication.createDisplay() line: 153    
    IDEApplication.start(IApplicationContext) line: 95  
    EclipseAppHandle.run(Object) line: 196  
    EclipseAppLauncher.runApplication(Object) line: 110 
    EclipseAppLauncher.start(Object) line: 79   
    EclipseStarter.run(Object) line: 344    
    EclipseStarter.run(String[], Runnable) line: 179    
    NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]  
    NativeMethodAccessorImpl.invoke(Object, Object[]) line: 57  
    DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43  
    Method.invoke(Object, Object...) line: 606  
    Main.invokeFramework(String[], URL[]) line: 622 
    Main.basicRun(String[]) line: 577   
    Main.run(String[]) line: 1410   
    Main.main(String[]) line: 1386