NOTICE! This is a static HTML version of a legacy ImageJ Trac ticket.

The ImageJ project now uses GitHub Issues for issue tracking.

Please file all new issues there.

Ticket #1043 (closed defect: fixed)

Opened 2012-03-01T13:38:47-06:00

Last modified 2012-03-02T09:45:10-06:00

IJ2 doesn't always close images and exceptions can arise

Reported by: bdezonia Owned by: bdezonia
Priority: major Milestone: imagej2-b1-initial
Component: Legacy Compatibility Version:
Severity: serious Keywords:
Cc: Blocked By:


Open blobs (shift cmd b)
Zoom in (cmd =)
Close blobs (cmd w) - but it doesn't actually close
Open blobs again (shift cmd b)
Exception throw: (below)

I believe the issue is that the close is not closing the IJ2 display but is closing and deleting the associated ImagePlus in IJ1. The next time you run a legacy plugin LegacyPlugin tries to harmonize all Displays with their ImagePluses. The unclosed display must have a bad reference to its associated ImagePlus.


at imagej.legacy.translate.LegacyUtils.dimensionsIJ1Compatible(
at imagej.legacy.plugin.LegacyPlugin.isLegacyCompatible(
at java.util.concurrent.FutureTask$Sync.innerRun(
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(
at java.util.concurrent.ThreadPoolExecutor$

Change History

comment:1 Changed 2012-03-01T13:53:20-06:00 by bdezonia

Okay, its not stale/closed ImagePlus issues. Its that since the window did not close when it should IJ2 thinks there is an active display and yet that active display has a null dataset associated with it. Must make sure the close actually closes the display and sets active display appropriately.

comment:2 Changed 2012-03-01T13:55:51-06:00 by curtis

Addressing ticket #995 may fix this bug.

comment:3 Changed 2012-03-01T14:47:00-06:00 by bdezonia

  • Status changed from new to closed
  • Resolution set to fixed

In 2ac9f2bf56dee339aee4adae5b81a95806320ab2 made sure windows close and also that active display is tracked better.

comment:4 Changed 2012-03-02T09:45:10-06:00 by bdezonia

Note that while fixing this ticket I changed the handling of window close / display deleted events.

WindowClosingEvents call display.close() and nothing else.

display.close() generates a DisplayDeletedEvent

Others listen for DisplayDeletedEvents and dispose of their resources.

The owner of the window closes it via window.close(). In the case where the user closed the window in the gui the later IJ2 call to window.close() causes a second display deleted event to be hatched. but it has no effect the second time.

Going forward we could avoid this double close behavior. We could have windows track their closed status and window.close() could only call dispose()/setVisible(false) if the window is not already closed.