Bug 4862 - Check for isDisposed() in dispose after sending Dispose Calback (1GLC25X)
Summary: Check for isDisposed() in dispose after sending Dispose Calback (1GLC25X)
Status: RESOLVED FIXED
Alias: None
Product: Platform
Classification: Eclipse Project
Component: SWT (show other bugs)
Version: 2.0   Edit
Hardware: All All
: P3 normal (vote)
Target Milestone: 3.2 M2   Edit
Assignee: Silenio Quarti CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2001-10-11 14:24 EDT by Veronika Irvine CLA
Modified: 2005-08-10 14:56 EDT (History)
2 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Veronika Irvine CLA 2001-10-11 14:24:23 EDT
Run the following example, click on the button and you get the SWT Exception wdiget is disposed.
See Stack trace below.
In the dispose method of a widget, we need to check that the widget has not been disposed in the Dispose callback.

public static void main(String args[]){
	Display display = new Display ();
	Shell shell = new Shell();
	shell.setLayout(new org.eclipse.swt.layout.GridLayout());
	shell.setBounds(100,30, 800,600);
	shell.open();
 
	final Composite panel = new Composite(shell, SWT.BORDER);
	panel.setBounds(20,430,100,100);
 
	final Button button = new Button(panel, 0);
	button.setText("dispose button");
	button.setBounds(7,7,80,70);
	final SelectionAdapter[] selectionListener = new SelectionAdapter[1];
	selectionListener[0] = new SelectionAdapter(){
		public void widgetSelected (org.eclipse.swt.events.SelectionEvent e){
			button.dispose();
		}
	};
	button.addSelectionListener(selectionListener[0]);
 
	final DisposeListener[] disposeListener = new DisposeListener[1];
	disposeListener[0] = new DisposeListener(){
		public void widgetDisposed(org.eclipse.swt.events.DisposeEvent e){
			button.removeDisposeListener(disposeListener[0]);
			panel.dispose();
		}
	};
	button.addDisposeListener(disposeListener[0]);
 
	while (!shell.isDisposed ()) {
		if (!display.readAndDispatch ()) display.sleep ();
	}
}


org.eclipse.swt.SWTException: Widget is disposed
	at org.eclipse.swt.SWT.error(SWT.java:1818)
	at org.eclipse.swt.SWT.error(SWT.java:1750)
	at org.eclipse.swt.widgets.Widget.error(Widget.java:379)
	at org.eclipse.swt.widgets.Control.getDisplay(Control.java:597)
	at org.eclipse.swt.widgets.Control.unsubclass(Control.java:2365)
	at org.eclipse.swt.widgets.Control.releaseWidget(Control.java:1247)
	at org.eclipse.swt.widgets.Button.releaseWidget(Button.java:344)
	at org.eclipse.swt.widgets.Widget.dispose(Widget.java:366)
	at veronika._Scrapbook$1.widgetSelected(_Scrapbook.java:43)
	at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:85)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:54)
	at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:645)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:1359)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:1160)
	at veronika._Scrapbook.main(_Scrapbook.java:58)
Exception in thread "main" 

NOTES:
Comment 1 DJ Houghton CLA 2001-10-29 16:44:40 EST
PRODUCT VERSION:
2.0 007

Comment 2 Veronika Irvine CLA 2004-09-24 10:09:22 EDT
In 3.1, I get a different error now on Windows:

java.lang.NullPointerException
	at org.eclipse.swt.widgets.Control.deregister(Control.java:498)
	at org.eclipse.swt.widgets.Control.releaseWidget(Control.java:1496)
	at org.eclipse.swt.widgets.Button.releaseWidget(Button.java:364)
	at org.eclipse.swt.widgets.Widget.dispose(Widget.java:368)
	at veronika.Newsgroup$1.widgetSelected(Newsgroup.java:25)
	at org.eclipse.swt.widgets.TypedListener.handleEvent
(TypedListener.java:89)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:82)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:796)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:2783)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2442)
	at veronika.Newsgroup.main(Newsgroup.java:40)
Comment 3 Steve Northover CLA 2005-08-09 18:35:07 EDT
Fixed > 20050809