在JTextField中检测回车


103

是否可以检测Enter在Java中键入JTextField 时有人按下的时间?无需创建按钮并将其设置为默认按钮。

Answers:


168

a JTextField被设计为ActionListenerJButtonis 一样使用a 。请参阅的addActionListener()方法JTextField

例如:

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

请注意,此示例使用Action实施,ActionListener因为它Action是具有其他功能的较新API。例如,您可以禁用,Action这将同时禁用文本字段和按钮的事件。


1
同意 在一般情况下,比我的解决方案更优雅。
科斯2010年

@camickr是Java摇摆专家
Mohamed Iqzas

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

                public void actionPerformed(ActionEvent e){

                        //statements!!!

                }});

您需要做的就是将addActionListener添加到JTextField中,就像上面一样!按下后,Enter该动作将执行您想要的语句!


16

为添加一个事件KeyPressed

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

-1 :(从Swing的角度来看,KeyListeners太低了。使用打算与Swing一起使用的API :-)
nIcE cCw

1
从Swing的角度来看, @nIcEcOw KeyListeners太低了:需要引用。
圭多2015年

2
@ᴳᵁᴵᴰᴼ:可以在KeyBindings的官方教程中找到非常有据可查的东西,尽管对stackoverflow的很好回答也涵盖了相同的方面:-)
nIcE 15年

1
@nIcEcOw正是我所想到的文档页面。我发现建议对快捷方式和操作使用绑定,建议仅使用侦听器在底层控制键盘,而不要使用绑定,因为这是错误的api,两者之间存在很多区别。文档页面也不是那么黑白。
圭多2015年

1
@ᴳᵁᴵᴰᴼ:KeyListeners有很多缺点,这些缺点在很大程度上已由解决 KeyBindings,例如与焦点有关,与复制/粘贴有关等。对于琐碎的任务(如OP中要求的),应避免使用。
尼斯牛

9

你想做这样的事情吗?

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

    });

1

首先通过以下方式在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
    }
}

1

其他答案(包括可接受的答案)也不错,但是如果您已经使用Java8,则可以执行以下操作(以更短的,更新的方式):

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

如已接受的答案所述,您可以简单地使用ActionListener,以捕获Enter键。

但是,我的方法利用了Java 8中引入的功能概念。

如果要对按钮和JTextField使用相同的操作,则可以执行以下操作:

ActionListener l = ae -> {
    //do stuff
}

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

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


0

如果要在JTextField输入中设置默认按钮动作,则必须执行以下操作:

//put this after initComponents();

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

它是[0],因为一个按钮可以执行很多操作,但通常只有一个操作(ActionPerformed)。


0

对于框架中的每个文本字段,调用addKeyListener方法。然后实现并覆盖keyPressed方法,如其他人所述。现在,您可以从框架中的任何字段按Enter键以激活操作。

@Override
        public void keyPressed(KeyEvent e) {
            if(e.getKeyCode() == KeyEvent.VK_ENTER){
                //perform action
            }
        }

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

要为“ Enter press”编写逻辑,JTextField最好将逻辑保留在keyReleased()块中,而不是keyTyped()keyPressed()


1
-1 :(用于再次重复相同的错误(在先前的答案中已经被否决,以及指定的相同原因)。KeyListenersSwing的角度来看,这些级别太低了。请使用旨在与Swing :-)
一起

-3

只需使用以下代码:

SwingUtilities.getRootPane(myButton).setDefaultButton(myButton);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.