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

标签 java swing focus jtextarea jtabbedpane

我有一个带有多个 JTabbedPane 的 swing GUI;每个选项卡在顶部包含两个 JButtons,然后是一个 JTextArea(用于用户输入),在底部包含一个用于结果的 JTextField

我的问题是,在切换选项卡后,如果不使用鼠标单击它或使用键盘上的 Tab 键,我无法让 JTextArea 获得焦点?

我有...

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

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

我试过向每个 textArea 添加一个 requestFocus,我试过在每个 textArea 上“置于最前面”,我也搞砸了 Focus Traversal,但我似乎没有做任何事情让 textArea 获得焦点选项卡更改?

这让我难住了一个星期,所以如果能提供任何帮助,我们将不胜感激?

最佳答案

将 ChangeListener 添加到您的 JTabbedPane。这是总体思路:

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

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();
  }
}

关于Java - 在选择新的 JTabbedPane 时如何获得对 JTextArea 的关注,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14265326/

相关文章:

cygwin 中的 java 控制台

java - 用户数据的 Base64 编码脚本(适用于 Java API 的 AWS 开发工具包)

java - 如何检查输入字符串是否包含空格?

java - Hibernate + 并发插入(MySQL INSERT IGNORE)

Java swing setSelectionForeground 性能问题

java - 幸运游戏 GUI.. 怎么了?

java - 如何从帮助菜单按钮打开 html 文件

html - 专注于粘性条强制页面中的输入以滚动到顶部

Delphi XE - TRibbon 操作始终将焦点发送到 MainForm

css - 具有 tabindex ="0"的不可点击元素是否应具有 :focus blue outline removed?