我打算做的是当我按下Enter
键时,应用程序会启动按钮btn_teach
,然后切换到另一个textfield
聚焦的标签页。现在,当我实现它时,它完美地工作如果我手动按下按钮(而不是按Enter
)。当我实际按下Enter
时,标签会切换回来,但该标签上的文字字段不会聚焦。
tp
为JTabbedPane
。
我的计划是从标签索引1切换到标签索引0并设置txt_send
重点
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
更改焦点的正确方法是什么?
答案 0 :(得分:5)
要让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();
}
});
}
}