Reputation: 4169
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
?
Upvotes: 1
Views: 2842
Reputation: 24616
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();
}
});
}
}
Upvotes: 5