JDesktopPane - how to get active frame
Asked Answered
S

3

9

How to get active (having focus) frame (JInternalFrame) that is inside JDesktopPane? I need it for my MDI notepad (not that anybody would use that, just a training project). Looking at api, I see only functions to get all JInternalFrames, not active one.

Saccharoid answered 17/12, 2011 at 4:33 Comment(0)
X
12

Use JDekstopPane.getSelectedFrame() method (From doc: currently active JInternalFrame in this JDesktopPane, or null if no JInternalFrame is currently active.) or JDesktopPane.getAllFrames() to get list of all JInternalFrames currently displayed in the desktop and check isSelected() method.

Xylidine answered 17/12, 2011 at 4:40 Comment(1)
Thanks. You really helped me. I looked for something like getActiveFrame or getFocusedFram and overlooked getSelectedFrame ;)Saccharoid
M
3

Make a List<JInternalFrame> and check isSelected() as you iterate though it.

Addendum: See also these examples that use Action to select an internal frame from a menu.

Malinowski answered 17/12, 2011 at 4:38 Comment(2)
Note that JDesktopPane.getAllFrames() returns an array, so you might as well just iterate the array (instead of using a list).Garvy
-1 for reinventing the wheel. Either getSelectedFrame() or getAllFrames() would be used.Alexandrite
F
2

Have you looked at the Java tutorial titled How to Use Internal Frames? In your code you need an InternalFrameListener (API) (Tutorial) and listen to activate/deactivate events. Activated means the internal frame was brought to the top; deactivated means it's no longer on top. Since JDesktopPane extends JLayeredPane you can also set the z-order of components added to it.

Don't iterate over all the panes - use events.

If for some reason you prefer to poll your UI rather than use an event-driven approach you can call getSelectedFrame which returns the active JInternalFrame. I'm not sure why no one else mentioned it.

Flung answered 17/12, 2011 at 4:48 Comment(7)
@Malinowski it's pretty straightforward, as JInternalFrames are created an InternalFrameListener is attached to each that keeps track of which frame is active and which is not. I've updated my answer a bit in case the poster doesn't care for events - JDesktopPane has the method getSelectedFrame.Flung
> In your code you need an InternalFrameListener (API) (Tutorial) and listen to activate/deactivate events. > Activated means the internal frame was brought to the top; deactivated means it's no longer on top. > Since JDesktopPane extends JLayeredPane you can also set the z-order of components added to it." In other words another tip on "How to make your code more confusing and less straightforward". Thank you, though I'll keep my code so simple that even if you never used Java you'd understand it.Saccharoid
-1 for reinventing the wheel. getSelectedFrame() was mentioned earlier.Alexandrite
@Alexandrite Polling the UI and listening for UI events are two completely different ways of handling the problem. Since you're not familiar with the difference here's an example. Let's say you have java.swing.Actions that back menu items and toolbar buttons. The Action (and thus the items and buttons) should only be enabled when certain frames are on top. Would you rather run a timer asking the JDesktopPane who's on top or just listen for events? Reinventing the wheel would be iterating over all the frames looking for isSelected when getSelectedFrame has been around since Java 1.3.Flung
@DariuszG.Jagielski, see my response to camickr, and good luck responding to changes in the UI.Flung
The question asked "how to get the active frame", not "how to track frame activation/deactivation". Your suggestion to use a listener and handle events to track the active frame is reinventing the wheel since a method exists to do this already. Agreed it is a solution for a different problem, just not this problem.Alexandrite
@camickr: I rolled back my careless edit; Paul had already linked to InternalFrameListener, which seems like a good use of the API. Edit: Sorry if I adversely influenced your appraisal.Malinowski

© 2022 - 2024 — McMap. All rights reserved.