未知错误:SWT错误:没有更多句柄

时间:2014-11-07 12:54:26

标签: java swt rcp

当展开视图中的多个树时(展开选定的树),将引发以下错误。 我无法找出究竟是什么引发了这个错误。这是我在异常后获得的堆栈跟踪,

org.eclipse.swt.SWTError: No more handles
    at org.eclipse.swt.SWT.error(SWT.java:4109)
    at org.eclipse.swt.SWT.error(SWT.java:3998)
    at org.eclipse.swt.SWT.error(SWT.java:3969)
    at org.eclipse.swt.widgets.Display.internal_new_GC(Display.java:2589)
    at org.eclipse.swt.graphics.Image.getImageData(Image.java:1371)
    at org.eclipse.swt.internal.ImageList.set(ImageList.java:401)
    at org.eclipse.swt.internal.ImageList.add(ImageList.java:66)
    at org.eclipse.swt.widgets.Tree.imageIndex(Tree.java:3636)
    at org.eclipse.swt.widgets.TreeItem.setImage(TreeItem.java:1686)
    at org.eclipse.jface.viewers.TreeViewerRow.setImage(TreeViewerRow.java:166)
    at org.eclipse.jface.viewers.ViewerCell.setImage(ViewerCell.java:169)
    at org.eclipse.jface.viewers.WrappedViewerLabelProvider.update(WrappedViewerLabelProvider.java:166)
    at org.eclipse.jface.viewers.ViewerColumn.refresh(ViewerColumn.java:152)
    at org.eclipse.jface.viewers.AbstractTreeViewer.doUpdateItem(AbstractTreeViewer.java:934)
    at org.eclipse.jface.viewers.AbstractTreeViewer$UpdateItemSafeRunnable.run(AbstractTreeViewer.java:102)
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
    at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:49)
    at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:175)
    at org.eclipse.jface.viewers.AbstractTreeViewer.doUpdateItem(AbstractTreeViewer.java:1014)
    at org.eclipse.jface.viewers.StructuredViewer$UpdateItemSafeRunnable.run(StructuredViewer.java:481)
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
    at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:49)
    at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:175)
    at org.eclipse.jface.viewers.StructuredViewer.updateItem(StructuredViewer.java:2141)
    at org.eclipse.jface.viewers.AbstractTreeViewer.createTreeItem(AbstractTreeViewer.java:829)
    at org.eclipse.jface.viewers.AbstractTreeViewer$1.run(AbstractTreeViewer.java:804)
    at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
    at org.eclipse.jface.viewers.AbstractTreeViewer.createChildren(AbstractTreeViewer.java:778)
    at org.eclipse.jface.viewers.TreeViewer.createChildren(TreeViewer.java:644)
    at org.eclipse.jface.viewers.AbstractTreeViewer.internalExpandToLevel(AbstractTreeViewer.java:1714)
    at org.eclipse.jface.viewers.AbstractTreeViewer.internalExpandToLevel(AbstractTreeViewer.java:1724)
    at org.eclipse.jface.viewers.AbstractTreeViewer.internalExpandToLevel(AbstractTreeViewer.java:1724)
    at org.eclipse.jface.viewers.AbstractTreeViewer.internalExpandToLevel(AbstractTreeViewer.java:1724)
    at org.eclipse.jface.viewers.AbstractTreeViewer.internalExpandToLevel(AbstractTreeViewer.java:1724)
    at org.eclipse.jface.viewers.AbstractTreeViewer.expandToLevel(AbstractTreeViewer.java:1056)
    at org.eclipse.jface.viewers.AbstractTreeViewer.expandToLevel(AbstractTreeViewer.java:1037)
    at org.eclipse.jface.viewers.AbstractTreeViewer.expandAll(AbstractTreeViewer.java:1026)
    at com.rockwellcollins.rccase.tarbuilder.actions.ExpandAllAction.run(ExpandAllAction.java:44)
    at org.eclipse.jface.action.Action.runWithEvent(Action.java:498)
    at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:584)
    at org.eclipse.jface.action.ActionContributionItem.access$2(ActionContributionItem.java:501)
    at org.eclipse.jface.action.ActionContributionItem$5.handleEvent(ActionContributionItem.java:411)
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
    at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4066)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3657)
    at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2640)
    at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2604)
    at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2438)
    at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:671)
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
    at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:664)
    at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
    at com.rockwellcollins.rccase.Application.start(Application.java:74)
    at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:369)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:620)
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:575)
    at org.eclipse.equinox.launcher.Main.run(Main.java:1408)
    at org.eclipse.equinox.launcher.Main.main(Main.java:1384)

//该树的Label Provider     公共类ViewTreeLabelProvider扩展了LabelProvider实现     IColorProvider,IBaseLabelProvider,IFontProvider {

@Override
public Image getImage(Object element) {

    if (element instanceof EObject) {
        return aa.getImages(element);
    }
    return super.getImage(element);
    }
}


// for loading image 
public class aa {
    public static Image getImages(Object element) {
        if (element instanceof ClassA) {
            return ClassA.getimage();
        } else if (element instanceof ClassB) {
            return ClassB.getimage();
        } else if (element instanceof ClassC) {
            return ClassC.getimage();
        }  else if (element instanceof ClassD) {
            return ClassD.getimage();
        }
        return null;
    }
}

我的项目代码库很大,我无法完全分享。所以,我用简单的方式编写了片段来传达问题。

实际上,图像放在图标文件夹中,并由AbstractUIPlugin.imageDescriptorFromPlugin(插件,路径)提取,后者将图像存储在Image注册表中。

我还注意到,这可能是由于Windows注册表中的GDI对象的限制。 达到10000 GDI对象限制后,抛出异常。 默认情况下,对于Windows 7,GDIProcessHandleQuota值为10,000。当我用Google搜索时,我发现,该值可以设置为最大值65,536。

我试图将GDIProcessHandleQuota从10,000增加到65,000。抛出相同的异常,但在达到19,932个GDIObject之后。 我预计,问题可能是由于GDIObjects处理不当造成的,而且Image.class中会抛出异常。

建议请!!

1 个答案:

答案 0 :(得分:0)

在ClassA.getimage()中,ClassB.getimage()...确保每次都不创建图像" .getimage()"被调用,缓存它。

    private Image image;

    public Image getImage() {
        if ( image == null) {
            image = new Image(Display.getDefault(), "");
        }
        return image;
    }

由于您似乎处于Eclipse环境中,因此甚至更好地使用" org.eclipse.jface.resource.ImageRegistry"。 在哪里" UIPlugin"是你的插件扩展" org.eclipse.ui.plugin.AbstractUIPlugin"。 如果您没有,请创建一个并将其添加到您的MANIFEST.MF(Bundle-Activator:YOURCLASS)。

    public Image getImage() {
        String key = getClass().getName();
        ImageRegistry imageRegistry = UIPlugin.getDefault().getImageRegistry();
        Image image = imageRegistry.get(key);
        if (image == null) {
            image = new Image(Display.getDefault(), "");
            imageRegistry.put(key, image);
        }
        return image;
    }