Question

I want to create a 'generic' JPanel which can be rendered in any of the higher level Window classes (JFrame, JDialog, or JInternalFrame to be somewhat precise.)

I want to be able to 'clean up' some static values when that window is no longer being rendered on screen. Normally, I would do this with a Window class (like JFrame) and simply addWindowListener with proper windowClosing or windowClosed methods during the creation of the JFrame.

Since I desire any of the Window classes to be able to render this, I don't even know which kind of listener to add nor do I know which window to add it to.

Is there a way to 'hook' the realization and rendering of the JPanel to so that I can add my shutdown hooks no matter what Window class renders it?

(I looked at PropertyChangeListener, but componentShown doesn't trigger on the JPanel rendering.)

Any help would be appreciated.

Was it helpful?

Solution

There's a few different options depending on the exact semantics you want. You can register a ComponentListener and handle the componentHidden method. Another possibility is to register a HierarchyListener and check for DISPLAYABILITY_CHANGED events. You could also use a HierarchyListener to find when the panel has been added or removed from a container and add/remove window listeners from the old and new window. The difference between the ComponentListener and HierarchyListener is that the ComponentListener is triggered by any visibility change while the HierarchyListener/DISPLAYABILITY_CHANGED event is triggered when the panel's window is disposed. ComponentListener is probably your best bet, but be aware that the panel might be set as visible again in the future.

You can also try the AncestorListener ancestorRemoved event. It's called if the component itself or any of it's ancestors is made invisibile.

OTHER TIPS

Well, I finally got something working, but I'm not sure I really like the answer.

I added an AncestorListener to the JPanel at creation. This listener stubbed out the ancestorRemoved and ancestorMoved events and in the ancestorAdded event, would hook the getTopLevelAncestor() with the appropriate WindowListener/InternalFrameListener so that I could run my shutdown code when the window closes.

If there's a better way, I'm open to it. (I'm going to be reviewing the HierarchyListener from Geoff.)

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top