【问题标题】:Detect enter press in JTextField在 JTextField 中检测回车键
【发布时间】:2011-05-24 02:38:30
【问题描述】:

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

【问题讨论】:

    标签: java swing jtextfield


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      正如公认的答案所说,您可以简单地使用ActionListener 做出反应,它会捕获 Enter-Key。

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

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

      ActionListener l = ae -> {
          //do stuff
      }
      
      button.addActionListener(l);
      textField.addActionListener(l);
      

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

      【讨论】:

        【解决方案3】:

        你想做这样的事情吗?

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

        【讨论】:

        • 第一个答案实际上准确地回答了问题
        【解决方案4】:

        如果您想在 JTextField 输入中设置默认按钮操作,您必须这样做:

        //put this after initComponents();
        
        textField.addActionListener(button.getActionListeners()[0]);
        

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

        【讨论】:

          【解决方案5】:
          JTextField function=new JTextField(8);   
          function.addActionListener(new ActionListener(){
          
                          public void actionPerformed(ActionEvent e){
          
                                  //statements!!!
          
                          }});
          

          您需要做的就是将ActionListener 添加到上面的JTextField 中!按下 Enter 后,该操作将在语句中执行您想要的操作!

          【讨论】:

            【解决方案6】:

            JTextField 旨在使用 ActionListener,就像 JButton 一样。参见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 );
            

            注意,这个例子使用了一个Action,它实现了ActionListener,因为Action 是一个新的API,有更多的特性。例如,您可以禁用 Action,这将禁用文本字段和按钮的事件。

            【讨论】:

            • 同意。在一般情况下,比我的解决方案更优雅。
            • @camickr 是 Java swings 专家
            • 您也可以在textField.addActionListener()方法中调用button.doClick();,而不是同时添加动作。
            【解决方案7】:

            只需使用此代码:

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

            【讨论】:

              【解决方案8】:

              首先在 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
                  }
              }
              

              【讨论】:

                【解决方案9】:
                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 press”编写逻辑,最好将逻辑保留在keyReleased() 块中,而不是keyTyped()keyPressed()

                【讨论】:

                • -1 :( 再次重复同样的错误,这在之前的答案中已经被否决,以及相同的指定原因。KeyListeners 的级别太低了@ 987654327@ 的观点。使用旨在与Swing 一起使用的 API :-)
                【解决方案10】:

                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 :-)
                • @nIcEcOw 从 Swing 的角度来看,KeyListeners 的级别太低了:需要引用。
                • @ᴳᵁᴵᴰᴼ:一个非常有据可查的东西,可以在KeyBindings 的官方教程中找到,虽然在stackoverflow 上一个非常好的answer,也涵盖了相同的方面:-)
                • @nIcEcOw 这正是我想到的文档页面。我发现建议优先使用快捷方式和操作的绑定,仅使用侦听器在低级别控制键盘不要使用,因为它是错误的api之间有很多区别我>。文档页面也不是那么黑白分明。
                • @ᴳᵁᴵᴰᴼ: KeyListeners 有很多缺点,KeyBindings 更大程度地解决了这些缺点,例如焦点相关、复制/粘贴相关等等。对于琐碎的任务,例如 OP 中所要求的,应避免使用它。
                猜你喜欢
                • 1970-01-01
                • 2012-08-12
                • 2012-01-22
                • 2013-04-29
                • 1970-01-01
                • 2018-01-16
                • 2015-02-21
                • 2020-05-19
                相关资源
                最近更新 更多