Skip to content

"Graphic is disposed" error #221

@HeikoKlare

Description

@HeikoKlare

We again face "Graphics is disposed" errors, see eclipse-platform/eclipse.platform.swt#1639:

org.eclipse.swt.SWTException: Graphic is disposed
	at org.eclipse.swt.SWT.error(SWT.java:4932)
	at org.eclipse.swt.SWT.error(SWT.java:4847)
	at org.eclipse.swt.SWT.error(SWT.java:4818)
	at org.eclipse.swt.graphics.Image.getImageData(Image.java:1400)
	at org.eclipse.jface.resource.CompositeImageDescriptor$CachedImageImageDataProvider.getImageData(CompositeImageDescriptor.java:114)
	at org.eclipse.jface.resource.CompositeImageDescriptor.getZoomedImageData(CompositeImageDescriptor.java:457)
	at org.eclipse.jface.resource.CompositeImageDescriptor.drawImage(CompositeImageDescriptor.java:267)
	at org.eclipse.jface.viewers.DecorationOverlayIcon.drawCompositeImage(DecorationOverlayIcon.java:217)
	at org.eclipse.jface.resource.CompositeImageDescriptor.getImageData(CompositeImageDescriptor.java:375)
	at org.eclipse.swt.internal.DPIUtil.lambda$2(DPIUtil.java:538)
	at org.eclipse.swt.internal.DPIUtil.getElementAtZoom(DPIUtil.java:567)
	at org.eclipse.swt.internal.DPIUtil.validateAndGetImageDataAtZoom(DPIUtil.java:538)
	at org.eclipse.swt.graphics.Image$ImageDataProviderWrapper.getBounds(Image.java:2188)
	at org.eclipse.swt.graphics.Image.getBounds(Image.java:1322)
	at org.eclipse.swt.graphics.Image.getBounds(Image.java:1312)
	at org.eclipse.swt.widgets.Button.computeSizeInPixels(Button.java:361)

The can be reproduced with the following snippet at 200% (primary) monitor zoom:

public class Snippet1 {

	public static void main(String[] args) {
		Display display = new Display();
		Shell shell = new Shell(display);
		shell.setText("Test");
		shell.setSize(300, 200);

		Image tempImage = new Image(display, 20, 20);
		ImageDescriptor[] overlaysArray = new ImageDescriptor[6];

		Image image = new DecorationOverlayIcon(tempImage, overlaysArray).createImage();
		tempImage.dispose();

		Button button = new Button(shell, SWT.PUSH);
		button.setImage(image);

		shell.open();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch()) {
				display.sleep();
			}
		}
		image.dispose();
		display.dispose();
	}
}

Issue needs to be fixed and we should add a regression test to avoid that we will run into the issue again.

Metadata

Metadata

Assignees

Labels

HiDPIA HiDPI-Related Issue or FeatureSWTIssue for SWT

Type

Projects

Status

✅ Done

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions