Изменить фокус через KeyListener при переключении между вкладками в JTabbedPane - PullRequest
1 голос
/ 04 февраля 2012

То, что я планировал сделать, - это когда я нажму кнопку Enter, приложение вызовет кнопку btn_teach и переключится на другую вкладку с фокусировкой textfield.Теперь, когда я его реализую, он отлично работает , если , я нажимаю кнопку вручную (не нажимая Enter).Когда я фактически нажимаю Enter, вкладка переключается обратно, но текстовое поле на этой вкладке не фокусируется.

tp, являющееся JTabbedPane.Мой план состоит в том, чтобы переключиться с указателя вкладок 1 на указатель вкладок 0 и установить txt_send focus

    public void actionPerformed(ActionEvent arg0) 
{
    // TODO Auto-generated method stub
        String say = txt_saypane.getText();
        String ans = txt_anspane.getText();
        //this.clear();

        say = say.replace("\n","");
        ans = ans.replace("\n","");

        this.talk(this.botTeach(say,ans), false);

        tp.setSelectedIndex(0);
}

    public void stateChanged(ChangeEvent arg0) 
{
    // TODO Auto-generated method stub
    int sel = tp.getSelectedIndex();
    if(sel == 0)
        txt_send.requestFocusInWindow();
    if(sel == 1)
        txt_saypane.requestFocusInWindow();
}

public void keyPressed(KeyEvent e) 
        {
            // TODO Auto-generated method stub
            if(e.getKeyCode() == KeyEvent.VK_ENTER)
            {

                if(txt_saypane.isFocusOwner() || txt_anspane.isFocusOwner())
                    btn_teach.doClick();
            }
    }

Как правильно изменить фокус с помощью KeyListener при переключении между вкладками в JTabbedPane?

1 Ответ

5 голосов
/ 04 февраля 2012

Чтобы JButton работал при нажатии клавиши ENTER, вы можете сделать это JButton вашим DEFAULT Button на кадре, вместо использования KeyEvents.Вы можете сделать это, написав:

yourFrameObject.getRootPane().setDefaultButton(btn_teach);

Написание этой строки также заставит этот JButton работать при нажатии клавиши ENTER, без написания для вас всей части KeyListener.Удалите KeyListeners из этого JButton.Когда этот JButton является DEFAULT Button, теперь включается. Нажав клавишу ENTER, он выполнит работу, записанную в методе actionPerformed ().

Не используйте KeyEvents с Swingпринадлежит awt, KeyBinding - это то, что мы используем с Swing.

Вот один пример программы, которая поможет вам:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class ButtonTest extends JFrame implements ActionListener
{
    private JTabbedPane tabbedPane;
    private JButton focusButton;
    private JPanel contentPane, tab1, tab2;
    private JTextField textField1, textField2, textField3;

    public ButtonTest()
    {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);

        tab1 = new JPanel();
        textField1 = new JTextField(10);
        textField1.requestFocusInWindow();
        tab1.add(textField1);

        tab2 = new JPanel();
        textField2 = new JTextField(10);
        textField3 = new JTextField(10);
        tab2.add(textField2);
        tab2.add(textField3);

        contentPane = new JPanel();
        contentPane.setLayout(new BorderLayout());

        tabbedPane = new JTabbedPane(JTabbedPane.TOP,
                                                JTabbedPane.WRAP_TAB_LAYOUT);
        tabbedPane.addTab("TAB 1", null, tab1, "I am TAB 1");
        tabbedPane.addTab("TAB 2", null, tab2, "I am TAB 2");

        focusButton = new JButton("CHANGE FOCUS");
        //focusButton.addMnemonic(KeyEvent.VK_ENTER); /* You can Add this Line too
                                                      /* , to make it work. But here
                                                       * you have to press ALT + ENTER.
                                                       */
        getRootPane().setDefaultButton(focusButton);
        focusButton.addActionListener(this);

        contentPane.add(tabbedPane, BorderLayout.CENTER);
        contentPane.add(focusButton, BorderLayout.PAGE_END);
        setContentPane(contentPane);
        pack();
        setVisible(true);
    }

    public void actionPerformed(ActionEvent ae)
    {
        if (tabbedPane.getSelectedIndex() == 0)
        {
            tabbedPane.setSelectedIndex(1);
            textField3.requestFocusInWindow();
        }
        else if (tabbedPane.getSelectedIndex() == 1)
        {
            tabbedPane.setSelectedIndex(0);
            textField1.requestFocusInWindow();
        }
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new ButtonTest();
            }
        });
    }
}
...