JDK-4793752 : Closing a JInternalFrame won't properly give focus to the next JInternalFrame
  • Type: Bug
  • Component: client-libs
  • Sub-Component: javax.swing
  • Affected Version: 1.4.1
  • Priority: P4
  • Status: Closed
  • Resolution: Duplicate
  • OS: windows_2000,windows_xp
  • CPU: x86
  • Submitted: 2002-12-13
  • Updated: 2004-09-03
  • Resolved: 2004-09-03
Related Reports
Duplicate :  
Description

Name: jk109818			Date: 12/13/2002


FULL PRODUCT VERSION :
java version "1.4.1_01"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.1_01-b01)
Java HotSpot(TM) Client VM (build 1.4.1_01-b01, mixed mode)

FULL OPERATING SYSTEM VERSION :
Microsoft Windows 2000 [Version 5.00.2195]

A DESCRIPTION OF THE PROBLEM :
In a JDesktopPane containing several JInternalFrames, if
you close an internal frame (with the close(X) button or
with the convenient keyboard short-cut, the internal frame
will be closed and the last previously selected internal
frame will be selected but, after that, the keyboard short-
cuts don't work (selectNextFrame, selectPreviousFrame,
close,...).
You need to click on an unselected internal frame to enable
again the keyboard short-cuts.

STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
1. Execute the given source code.
2. Select one internal frame
3. Close it with the close button or the keystroke CTRL+F4.
(Another internal frame is selected automatically)
4. Using CTRL+F4 won't work on the currently selected
internal frame.
You can't use any of the keyboard short-cuts (close,
selectNextFrame...) until you click on an unselected
internal frame with the mouse.

EXPECTED VERSUS ACTUAL BEHAVIOR :
You must be allowed to use keyboard short-cuts after you
have closed a window.
It is a problem of focus : after an internal frame is
closed, another internal frame is well selected but doesn't
have the focus.


REPRODUCIBILITY :
This bug can be reproduced always.

---------- BEGIN SOURCE ----------
import java.awt.*;
import javax.swing.*;

public class TestDesktopFrame extends JFrame {
    JDesktopPane desktop;
    public TestDesktopFrame() {
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		desktop = new JDesktopPane();
		JInternalFrame frame1 = null;
		for (int i = 0; i<5; i++) {
			frame1 = new JInternalFrame("Fr "+i, true, true, true,
true);
			frame1.setBounds(i*50, i*50,200,200);
			desktop.add(frame1);
			frame1.setVisible(true);
		}
		getContentPane().add(desktop, BorderLayout.CENTER);
		setSize(600,600);
		setVisible(true);
    }

    public static void main(String[] args) {
        new TestDesktopFrame();
    }
}
---------- END SOURCE ----------

CUSTOMER WORKAROUND :
As workaround, I simply use an InternalFrameListener which
ask to the selected frame to request the focus when the
method internalFrameClosed is called.
[code]
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.event.*;

public class WorkAroundDesktopFrame extends JFrame {
    JDesktopPane desktop;
    public WorkAroundDesktopFrame() {
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		desktop = new JDesktopPane();
		InternalFrameAdapter adap = new
InternalFrameAdapter() {
			public void internalFrameClosed
(InternalFrameEvent e) {
				JInternalFrame itf =
desktop.getSelectedFrame();
				if (itf != null) {
					itf.requestFocus();
	
				}
			}
		};
		JInternalFrame frame = null;
		for (int i = 0; i<5; i++) {
			frame = new JInternalFrame("Fr "+i,
true, true, true, true);
			frame.setBounds(i*50, i*50,200,200);
			frame.addInternalFrameListener
(adap);
			desktop.add(frame);
			frame.setVisible(true);
		}
		getContentPane().add(desktop,
BorderLayout.CENTER);
		setSize(600,600);
		setVisible(true);
    }

    public static void main(String[] args) {
        new WorkAroundDesktopFrame();
    }
}
[/code]
(Review ID: 179101) 
======================================================================

Comments
EVALUATION Sounds like a duplicate. There are several problems with focus and internal frames. These issues will be tackled in the next version of the J2SE. ###@###.### 2002-12-17 Closing as a duplicate of 4878528. ###@###.### 2004-09-03
17-12-2002