2

JTabbedPane複数のsを持つswingGUIがあります。各タブにはJButtons、上部に2つ、次にJTextArea(ユーザー入力用)、JTextField下部に結果用のaが含まれています。

私の問題は、JTextAreaタブを切り替えた後、マウスでクリックするか、キーボードのタブキーを使用しないと、フォーカスを取得できないことです。

私は持っています...

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

...これはアプリを最初に実行したときにうまく機能します(最初のタブのtextAreaにフォーカスがあります)が、別のタブ付きペインに切り替えると、textAreaではなく最初のボタンにフォーカスがあります。 textAreaはフォーカスを失い、もう一度最初のボタンにフォーカスがあります。

各textAreaにrequestFocusを追加してみました。また、各textAreaで「Bringtofront」を試しました。FocusTraversalをいじりましたが、textAreaがタブの変更にフォーカスするようになっているようです。

これは私が一週間困惑していたので、何か助けがありがたいことに受けられますか?

4

2 に答える 2

6

JTabbedPane に ChangeListener を追加します。一般的な考え方は次のとおりです。

[申し訳ありませんが、古いスタブが転がっていたので、JTextAreas の代わりに JTextFields を使用しましたが、考え方は同じです。]

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 に答える