سؤال

What I planned to do is when I press Enter key, the application will fire up the button btn_teach, and switch to another tab with textfield focused. Now, when I implement it, it works perfectly if I press the button manually (not pressing Enter). When I actually press Enter, the tab switches back but the text field on that tab is not focused.

tp being JTabbedPane. My plan is to switch from tab index 1 to tab index 0 and set txt_send focused

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

What is the correct way to change focus via KeyListener when switching between tabs in JTabbedPane?

هل كانت مفيدة؟

المحلول

For JButton to work on press of the ENTER key you can make that JButton to be your DEFAULT Button on frame, instead of using KeyEvents. You can do this by writing :

yourFrameObject.getRootPane().setDefaultButton(btn_teach);

Writing this line will also make this JButton work on pressing the ENTER key, without you writing the whole KeyListener part for it. Remove the KeyListeners from this JButton. Once this JButton is the DEFAULT Button, now on Pressing the ENTER key, it will do the work that is written inside it's actionPerformed() method.

Don't use KeyEvents with Swing, that belongs to awt, KeyBinding is what we use with Swing.

Here is one sample program to help your cause :

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();
            }
        });
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top