在JTextField中检测回车键按下

117

在Java中,是否有可能检测到当某人在JTextField中输入时按下Enter键?而不必创建一个按钮并将其设置为默认按钮。

10个回答

185

JTextField 的设计与 JButton 相似,可以使用 ActionListener。请见 JTextFieldaddActionListener() 方法。

例如:

Action action = new AbstractAction()
{
    @Override
    public void actionPerformed(ActionEvent e)
    {
        System.out.println("some action");
    }
};

JTextField textField = new JTextField(10);
textField.addActionListener( action );

现在当使用 Enter 键时,事件会被触发。

另外一个好处是,即使您不想将按钮设置为默认按钮,您也可以与按钮共享侦听器。

JButton button = new JButton("Do Something");
button.addActionListener( action );

请注意,此示例使用一个实现了ActionListener接口的Action类,因为Action是一个拥有额外功能的新API。例如,您可以禁用Action,这将禁用文本字段和按钮的事件。


1
同意。在一般情况下,比我的解决方案更优雅。 - Kos
@camickr是Java Swings的专家。 - Mohamed Iqzas
你可以在 textField.addActionListener() 方法中调用 button.doClick();,而不是将该操作添加到两个方法中。 - Mohammad Kholghi

27
JTextField function=new JTextField(8);   
function.addActionListener(new ActionListener(){

                public void actionPerformed(ActionEvent e){

                        //statements!!!

                }});

你所需要做的就是像上面那样对JTextField添加addActionListener!当你按下Enter键时,该操作将会在语句中执行你想要的操作!


20

添加一个KeyPressed事件。

private void jTextField1KeyPressed(java.awt.event.KeyEvent evt) {
  if(evt.getKeyCode() == KeyEvent.VK_ENTER) {
      // Enter was pressed. Your code goes here.
   }
} 

-1 :( KeyListeners从Swing的角度来看太低级了。使用旨在与Swing一起使用的API :-) - nIcE cOw
1
@nIcEcOw:从Swing的角度来看,_KeyListeners过于底层_:需要引用证明。 - guido
2
@ᴳᵁᴵᴰᴼ:这个东西非常好的文档可以在KeyBindings官方教程中找到,虽然stackoverflow上的一个很好的答案也涵盖了相同的方面 :-) - nIcE cOw
1
@nIcEcOw,这正是我想要的文档页面。我发现在建议“优先使用绑定来处理快捷键和操作,只在低级别控制键盘时使用监听器”与“不要使用因为它是错误的API”之间存在很大差异。文档页面也并不是那么黑白分明。 - guido
1
@ᴳᵁᴵᴰᴼ:KeyListeners(键盘监听器)存在许多缺陷,这些缺陷往往被KeyBindings(键绑定)更好地解决,比如与焦点相关的问题、复制/粘贴相关的问题等等。因此,在处理像OP所询问的这种琐碎任务时应避免使用KeyListeners - nIcE cOw
显示剩余4条评论

11

你想做类似这样的事情吗?

JTextField mTextField = new JTextField();
    mTextField.addKeyListener(new KeyAdapter() {
        @Override
        public void keyPressed(KeyEvent e) {
            if(e.getKeyCode() == KeyEvent.VK_ENTER){
                // something like...
               //mTextField.getText();
               // or...
               //mButton.doClick();
            }
        }

    });

第一个答案实际上精确地回答了问题。 - Vinz

1

其他答案(包括被采纳的)都很好,但如果您已经使用Java8,您可以按照以下方式进行操作(更短、更新的方式):

textField.addActionListener(
    ae -> {
        //dostuff
    }
);

正如接受的答案所述,您可以简单地使用ActionListener来响应捕获Enter键。然而,我的方法利用了Java 8引入的函数概念。
如果您想要为按钮和JTextField使用相同的操作,可以执行以下操作:
ActionListener l = ae -> {
    //do stuff
}

button.addActionListener(l);
textField.addActionListener(l);

如果需要进一步解释,请告诉我!

0

首先通过以下方式在JButton或JTextField上添加操作命令:

JButton.setActionCommand("name of command");
JTextField.setActionCommand("name of command");

然后将ActionListener添加到JTextField和JButton。

JButton.addActionListener(listener);
JTextField.addActionListener(listener);

接下来,在你的ActionListener实现中编写

@Override
public void actionPerformed(ActionEvent e)
{
    String actionCommand = e.getActionCommand();

    if(actionCommand.equals("Your actionCommand for JButton") || actionCommand.equals("Your   actionCommand for press Enter"))
    {
        //Do something
    }
}

0
对于您框架中的每个文本字段,请调用addKeyListener方法。然后实现并覆盖keyPressed方法,就像其他人所指示的那样。现在,您可以从框架中的任何字段按Enter键来激活您的操作。
@Override
        public void keyPressed(KeyEvent e) {
            if(e.getKeyCode() == KeyEvent.VK_ENTER){
                //perform action
            }
        }

-1
如果您想在JTextField中设置默认的按钮操作,您需要执行以下操作:
//put this after initComponents();

textField.addActionListener(button.getActionListeners()[0]);

这是因为一个按钮可以有很多操作,但通常只有一个(ActionPerformed)。


-3

只需使用此代码:

SwingUtilities.getRootPane(myButton).setDefaultButton(myButton);

-3
public void keyReleased(KeyEvent e)
{
    int key=e.getKeyCode();
    if(e.getSource()==textField)
    {
        if(key==KeyEvent.VK_ENTER)
        { 
            Toolkit.getDefaultToolkit().beep();
            textField_1.requestFocusInWindow();                     
        }
    }

JTextField中编写“Enter键按下”的逻辑时,最好将逻辑放在keyReleased()块内,而不是keyTyped()keyPressed()


2
-1 :( 再次犯了同样的错误,这已经在之前的答案中被投票否决,并附有相应的原因。从Swing的角度来看,KeyListeners太低级了。请使用旨在与Swing一起使用的API :-) - nIcE cOw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接