JDK-6294949 : Can't give Focus to desired compont inside JTabbedPane
  • Type: Bug
  • Component: client-libs
  • Sub-Component: javax.swing
  • Affected Version: 5.0
  • Priority: P4
  • Status: Closed
  • Resolution: Duplicate
  • OS: windows_xp
  • CPU: x86
  • Submitted: 2005-07-08
  • Updated: 2011-02-16
  • Resolved: 2006-04-03
Related Reports
Duplicate :  
Description
FULL PRODUCT VERSION :
java version "1.5.0_04"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_04-b05)
Java HotSpot(TM) Client VM (build 1.5.0_04-b05, mixed mode, sharing)


ADDITIONAL OS VERSION INFORMATION :
Microsoft Windows XP [Version 5.1.2600]

A DESCRIPTION OF THE PROBLEM :
When the user selects a tab i want to give the focus to a special component.
So i registered a ChangeListener to the TabbedPane.
In all version prior 1.5.0_04  it was working most of the time (i always had problems when using key listener to change the selected tab, like in the example, and than giving focus to a special component. This sometimes worked and sometimes not !) .
Now Java seems to give the Focus always to the first componet in the tab.
I think Its because of this bugfix:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6210088.





STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Compile and run my src.
Change Tabs.

EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
When the user selects Tab 1(via mouse or via F1 or via Alt+1)  focus should go to tf2, when the user select Tab 2 (via mouse or via F2 or via Alt+2)  focus should go to tf4
ACTUAL -
Now focus always goes to tf1 or tf3.

REPRODUCIBILITY :
This bug can be reproduced always.

---------- BEGIN SOURCE ----------
import javax.swing.*;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

public class TabbedPaneDemo extends JPanel {
    JTextField tf1;
    JTextField tf2;
    JTextField tf3;
    JTextField tf4;
    JTabbedPane tabbedPane;
    KeyAdapter ka;

    public TabbedPaneDemo() {
        super(new GridLayout(1, 1));
        ka = new KeyAdapter() {
            public void keyReleased(KeyEvent ev) {
                if (ev.getKeyCode() == KeyEvent.VK_F1) {
                    tabbedPane.setSelectedIndex(0);
                    //tf2.requestFocusInWindow();
                } else  if (ev.getKeyCode() == KeyEvent.VK_F2) {
                    tabbedPane.setSelectedIndex(1);
                    //tf4.requestFocusInWindow();
                }
            }
        };
        tf1 = new JTextField();
        tf1.setColumns(10);
        tf1.addKeyListener(ka);
        tf2 = new JTextField();
        tf2.setColumns(10);
        tf2.addKeyListener(ka);
        tf3 = new JTextField();
        tf3.setColumns(10);
        tf3.addKeyListener(ka);
        tf4 = new JTextField();
        tf4.setColumns(10);
        tf4.addKeyListener(ka);


        tabbedPane = new JTabbedPane();
        tabbedPane.addChangeListener(new ChangeListener() {
            public void stateChanged(ChangeEvent e) {
                if (tabbedPane.getSelectedIndex() == 0)  {
                    tf2.requestFocusInWindow();
                } else {
                    tf4.requestFocusInWindow();
                }
            }
        });
        tabbedPane.setFocusable(false);
        JComponent panel1 = makeTextPanel("Panel #1");
        panel1.add(tf1);
        panel1.add(tf2);
        tabbedPane.addTab("Tab 1", null, panel1,
                          "Does nothing");
        tabbedPane.setMnemonicAt(0, KeyEvent.VK_1);

        JComponent panel2 = makeTextPanel("Panel #2");
        panel2.add(tf3);
        panel2.add(tf4);
        tabbedPane.addTab("Tab 2", null, panel2,
                          "Does twice as much nothing");
        tabbedPane.setMnemonicAt(1, KeyEvent.VK_2);

        add(tabbedPane);
    }

    protected JComponent makeTextPanel(String text) {
        JPanel panel = new JPanel(false);
        JLabel filler = new JLabel(text);
        filler.setHorizontalAlignment(JLabel.CENTER);
        panel.setLayout(new FlowLayout());
        panel.add(filler);
        return panel;
    }

    private static void createAndShowGUI() {
        JFrame frame = new JFrame("TabbedPaneDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JComponent newContentPane = new TabbedPaneDemo();
        newContentPane.setOpaque(true);
        frame.getContentPane().add(new TabbedPaneDemo(),
                                 BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}
---------- END SOURCE ----------
###@###.### 2005-07-08 12:09:01 GMT

Comments
EVALUATION Contribution-Forum:https://jdk-collaboration.dev.java.net/servlets/ProjectForumMessageView?messageID=12460&forumID=1463
05-04-2006

EVALUATION Contribution-Forum:https://jdk-collaboration.dev.java.net/servlets/ProjectForumMessageView?messageID=12459&forumID=1463
05-04-2006

EVALUATION It is a duplicate of 5089436.
03-04-2006

EVALUATION I have yet to confirm, but I think this is a duplicate of 5089436.
02-08-2005