2

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

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

我有...

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

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

我已经尝试向每个 textArea 添加一个 requestFocus,并且我已经尝试在每个 textArea 上“带到前面”,并且我已经搞砸了 Focus Traversal,但我所做的似乎没有让 textArea 获得对选项卡更改的关注?

这让我难倒了一个星期,所以任何帮助都会感激不尽?

4

2 回答 2

6

将 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();
  }
}
于 2013-01-10T19:23:15.003 回答
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(); }});
                }
          }
       });

......现在一切都好起来了!谢谢大家。

于 2013-01-11T21:09:40.093 回答