Java - 在选择新的JTabbedPane时如何关注JTextArea

时间:2013-01-10 18:59:37

标签: java swing focus jtextarea jtabbedpane

我有一个包含多个JTabbedPane s的swing GUI;每个标签页顶部包含两个JButtons,然后是JTextArea(用于用户输入),底部包含JTextField的结果。

我的问题是,在没有用鼠标点击或使用键盘上的Tab键切换标签后,我无法让JTextArea获得焦点?

我有......

frame.addWindowFocusListener(new WindowAdapter() {
                        public void windowGainedFocus(WindowEvent e) {
                            textArea_1.requestFocusInWindow();

...这在首次运行应用程序时效果很好(第一个选项卡中的textArea具有焦点)但是当我切换到另一个tabbedpane时,第一个按钮现在具有焦点而不是textArea,当我切换回来时在第一个标签中,textArea失去焦点,第一个按钮再次具有焦点。

我已经尝试为每个textArea添加一个requestFocus,并且我在每个textArea上尝试过“Bring to front”,并且我已经搞乱了Focus Traversal但是我没做什么似乎让textArea重点关注一个标签更改?

这让我难过了一个星期,所以会感激地收到任何帮助吗?

2 个答案:

答案 0 :(得分:5)

将ChangeListener添加到JTabbedPane。这是一般的想法:

[抱歉,我使用了JTextFields而不是JTextAreas,因为我有一个旧的存根 - 但这个想法是一样的。]

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.event.*;

public class JTabbedPaneDemo3 implements Runnable
{
  JTextField txtFoo;
  JTextField txtBar;
  JTabbedPane tabbedPane;

  public static void main(String[] args)
  {
    SwingUtilities.invokeLater(new JTabbedPaneDemo3());
  }

  public void run()
  {
    txtFoo = new JTextField(10);
    final JPanel pnlFoo = new JPanel();
    pnlFoo.add(new JButton("Button 1"));
    pnlFoo.add(new JLabel("Foo"));
    pnlFoo.add(txtFoo);

    txtBar = new JTextField(10);
    final 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(new ChangeListener()
    {
      public void stateChanged(ChangeEvent 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.setLocationRelativeTo(null);
    frame.setVisible(true);

    txtFoo.requestFocusInWindow();
  }
}

答案 1 :(得分:0)

我无法让“getSelectedComponent()”为我工作,它只是没有看到对选项卡选择所做的任何更改,但我稍微修改了你的建议并接受了MadProgrammer的建议并添加了invokeLater ...

tabbedPane.addChangeListener(new ChangeListener()
        {
          public void stateChanged(ChangeEvent e)
          {
              JTabbedPane pane = (JTabbedPane) e.getSource();         
              int selectedIndex = pane.getSelectedIndex();         
              if (selectedIndex == 0)
                {
                SwingUtilities.invokeLater( new Runnable() {   
                public void run() {   
                textArea1.requestFocusInWindow(); }});
                }
             else if (selectedIndex == 1)
                {
                SwingUtilities.invokeLater( new Runnable() {   
                public void run() {   
                textArea2.requestFocusInWindow(); }});
                }
             else if (selectedIndex == 2)
                {
                SwingUtilities.invokeLater( new Runnable() {   
                public void run() {   
                textArea3.requestFocusInWindow(); }});
                }
             else if (selectedIndex == 3)
                {
                SwingUtilities.invokeLater( new Runnable() {   
                public void run() {   
                textArea4.requestFocusInWindow(); }});
                }
             else if (selectedIndex == 4)
                {
                SwingUtilities.invokeLater( new Runnable() {   
                public void run() {   
                textArea5.requestFocusInWindow(); }});
                }
          }
       });

......现在再一次对世界都是对的!谢谢大家。