Java Swing How to - Gain focus on JTextArea when selecting a new JTabbedPane








Question

We would like to know how to gain focus on JTextArea when selecting a new JTabbedPane.

Answer

import java.awt.BorderLayout;
import java.awt.Component;
//  w  w w.  ja  v a2s.com
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;

public class Main {
  public static void main(String[] args) {
    JTabbedPane tabbedPane;
    JTextField txtFoo = new JTextField(10);
    JPanel pnlFoo = new JPanel();
    pnlFoo.add(new JButton("Button 1"));
    pnlFoo.add(new JLabel("Foo"));
    pnlFoo.add(txtFoo);

    JTextField txtBar = new JTextField(10);
    JPanel pnlBar = new JPanel();
    pnlBar.add(new JButton("Button 3"));
    pnlBar.add(new JLabel("Bar"));
    pnlBar.add(txtBar);

    tabbedPane = new JTabbedPane();
    tabbedPane.addTab("Tab 1", pnlFoo);
    tabbedPane.addTab("Tab 2", pnlBar);

    tabbedPane.addChangeListener(e -> {
      Component comp = tabbedPane.getSelectedComponent();
      if (comp.equals(pnlFoo)) {
        txtFoo.requestFocusInWindow();
      } else if (comp.equals(pnlBar)) {
        txtBar.requestFocusInWindow();
      }
    });

    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(460, 200);
    frame.getContentPane().add(tabbedPane, BorderLayout.CENTER);
    frame.setVisible(true);

    txtFoo.requestFocusInWindow();
  }
}