以编程方式触发JTextField中的键事件?

时间:2012-11-26 10:36:49

标签: java swing jtextfield keyevent

如何以编程方式触发正在 ENTER 上侦听事件的JTextField按键事件?

JTextField上关键事件的监听器声明如下:

myTextField.addKeyListener(new KeyAdapter() {

    @Override
    public void keyTyped(KeyEvent e) {
        if (e.getKeyChar() == KeyEvent.VK_ENTER) {
            // Do stuff
        }
    }
});

感谢。

2 个答案:

答案 0 :(得分:13)

  • 不要在KeyListener上使用JTextField,只需添加ActionListener,当按下 ENTER 时会触发(感谢@robin +1 for建议)

    JTextField textField = new JTextField();
    
    textField.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent ae) {
             //do stuff here when enter pressed
        }
    });
    
  • 要触发KeyEvent在组件上使用requestFocusInWindow()并使用Robot课程模拟按键

像这样:

textField.requestFocusInWindow();

try { 
    Robot robot = new Robot(); 

    robot.keyPress(KeyEvent.VK_ENTER); 
} catch (AWTException e) { 
e.printStackTrace(); 
} 

示例:

import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class Test {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                JTextField textField = new JTextField();

                textField.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent ae) {
                        System.out.println("Here..");
                    }
                });
                frame.add(textField);

                frame.pack();
                frame.setVisible(true);

                textField.requestFocusInWindow();

                try {
                    Robot robot = new Robot();

                    robot.keyPress(KeyEvent.VK_ENTER);
                } catch (AWTException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

<强>更新

像@Robin和@mKorbel这样的人建议您可能需要DocumentListener / DocumentFiler(过滤器​​允许在更新JTextField之前进行验证)。

在IMO数据验证的情况下,您将需要这个。

看到类似的问题here

它显示了如何将DocumentFilter添加到JTextField以进行数据验证。文档过滤的原因就像我说的那样,在显示chnage之前允许验证,这是更有用的IMO

答案 1 :(得分:4)

您可以自己构造Event,然后在JTextField上调用dispatchEvent。

  KeyEvent keyEvent = new KeyEvent(...); //create
  myTextField.dispatchEvent();

对于KeyEvent的参数,可以参考KeyEvent constructors