首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建KeyEvent

如何创建KeyEvent
EN

Stack Overflow用户
提问于 2013-02-14 10:51:47
回答 4查看 35.9K关注 0票数 2

创建KeyListener时,它需要以下字段:

代码语言:javascript
复制
public void keyPressed(KeyEvent e) 
{

}
public void keyReleased(KeyEvent e) 
{

}
public void keyTyped(KeyEvent e) 
{

}

但是,当我将System.out.println(e)放入keyPressed方法中时,当我按enter键时,它会返回以下内容:

代码语言:javascript
复制
java.awt.event.KeyEvent[KEY_PRESSED,keyCode=10,keyText=?,keyChar=?,keyLocation=KEY_LOCATION_STANDARD,rawCode=0,primaryLevelUnicode=0,scancode=0] on javax.swing.JButton[,1,1,100x100,alignmentX=0.0,alignmentY=0.5,border=com.apple.laf.AquaButtonBorder$Dynamic@13b33a0e,flags=288,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=0,left=2,bottom=0,right=2],paintBorder=true,paintFocus=true,pressedIcon=,rolloverEnabled=false,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=HI,defaultCapable=true]

这显然不是一个KeyEvent,所以我不能用它来调用keyPressed(KeyEvent e)。我想要做的是以一种激活keyListener并将文本输出到JTextArea的方式来模拟按键,特别是Enter键的按下。

注意:我看了How can I perfectly simulate KeyEvents?的公认答案,对它的实际工作原理知之甚少,我想要我能理解的代码。我也看了看这里的How to simulate keyboard presses in java?,但并不是我不能让机器人工作;当一个键应该被按下的时候什么也没有发生。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-02-14 10:56:20

E是KeyEvent。

如果你想看到e的值,你可以试试这个

代码语言:javascript
复制
System.out.println(e.getKeyChar());

创建KeyEvent:

代码语言:javascript
复制
KeyEvent e = new KeyEvent(Component source, int id, long when, int modifiers, int keyCode, char keyChar, int keyLocation);

示例(不知道这是否是正确的方法,但它会产生正确的输出):

代码语言:javascript
复制
Button a = new Button("click");
    KeyEvent e;
    e = new KeyEvent(a, 1, 20, 1, 10, 'a');
    System.out.println(""+e.getKeyChar());
    System.out.println(""+e.getKeyCode());

下面是所有类型的KeyEvent参数

代码语言:javascript
复制
java.​awt.​event.​KeyEvent
@Deprecated public KeyEvent(Component source, int id, long when, int modifiers, int keyCode)
Deprecated. as of JDK1.1

===

代码语言:javascript
复制
java.​awt.​event.​KeyEvent
public KeyEvent(Component source, int id, long when, int modifiers, int keyCode, char keyChar)
Constructs a KeyEvent object.
Note that passing in an invalid id results in unspecified behavior. This method throws an IllegalArgumentException if source is null.
Parameters:
source - the Component that originated the event id - an integer identifying the type of event when - a long integer that specifies the time the event occurred modifiers - the modifier keys down during event (shift, ctrl, alt, meta) Either extended _DOWN_MASK or old _MASK modifiers should be used, but both models should not be mixed in one event. Use of the extended modifiers is preferred. keyCode - the integer code for an actual key, or VK_UNDEFINED (for a key-typed event) keyChar - the Unicode character generated by this event, or CHAR_UNDEFINED (for key-pressed and key-released events which do not map to a valid Unicode character) 
Throws:
IllegalArgumentException - if id is KEY_TYPED and keyChar is CHAR_UNDEFINED; or if id is KEY_TYPED and keyCode is not VK_UNDEFINED IllegalArgumentException - if source is null

===

代码语言:javascript
复制
java.​awt.​event.​KeyEvent
public KeyEvent(Component source, int id, long when, int modifiers, int keyCode, char keyChar, int keyLocation)
票数 4
EN

Stack Overflow用户

发布于 2013-02-14 11:23:14

使用robot时,首先获取要将KeyListener添加到的组件的焦点。然后你可以使用机器人来模拟按键。作为另一种选择,您可以只在您的侦听器添加到的组件上使用dispatchEvent。

代码语言:javascript
复制
KeyEvent key = new KeyEvent(inputField, KeyEvent.KEY_TYPED, System.currentTimeMillis(), 0, KeyEvent.VK_UNDEFINED, 'Z');
inputField.dispatchEvent(key);

前提是您拥有:

代码语言:javascript
复制
JInputField InputField = new JInputField();

您也可以创建如上所述的KeyEvent并将其传递给侦听器的keyTyped方法。至于keyPrssed,你也可以这样做。

票数 2
EN

Stack Overflow用户

发布于 2013-02-14 11:19:25

你声明:

我相信它会让我的部分代码更有效率。当满足某些条件时(我正在做绞刑,这是一个“作弊”,这是我的老师的一个笑话),计算机将按正确的键来“猜测”答案。然后是一个简单的问题,我想知道我是否可以?其中的一部分。当我看到JButton.doClick()并想知道它是否有一个用于JTextFields的函数时,我就开始这样做了

正如我所怀疑的那样,你做的这一切都是错的。如果你想让你的程序为你按键,就不需要创建KeyEvents。如果“键”是JButtons,那么只需在按钮上调用doClick()即可。如果您希望将文本填充到JTextField中,则只需设置文本即可。即,

例如,如果您在Swing计时器中调用下面的文本位(为了减慢它的速度,以便看到添加的文本:

代码语言:javascript
复制
String myText = myTextField.getText();
myText += nextBitOfText;
myTextField.setText(myText);

你可能会得到你想要的效果。

例如:

代码语言:javascript
复制
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.*;

@SuppressWarnings("serial")
public class AddTextToTextField extends JPanel {
   public static final String[] POSSIBLE_TEXTS = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday"};
   public static final int TIMER_DELAY = 500;
   private JTextField myTextField = new JTextField(20);
   private JButton myButton = new JButton(new BtnAction("Press Me"));
   private Random random = new Random();

   public AddTextToTextField() {
      add(myTextField);
      add(myButton);
   }

   private class BtnAction extends AbstractAction {
      public BtnAction(String text) {
         super(text);
      }

      @Override
      public void actionPerformed(ActionEvent arg0) {
         setEnabled(false);
         myTextField.setText("");
         myTextField.setFocusable(false);
         String randomText = POSSIBLE_TEXTS[random.nextInt(POSSIBLE_TEXTS.length)];
         new Timer(TIMER_DELAY, new TimerAction(this, randomText)).start();
      }
   }

   private class TimerAction implements ActionListener {
      private AbstractAction btnAction;
      private String text;
      private int count = 0;

      public TimerAction(AbstractAction btnAction, String text) {
         this.btnAction = btnAction;
         this.text = text;
      }

      @Override
      public void actionPerformed(ActionEvent e) {
         if (count <= text.length()) {
            myTextField.setText(text.substring(0, count));
            count++;
         } else {
            ((Timer)e.getSource()).stop();
            btnAction.setEnabled(true);
            myTextField.setFocusable(true);
         }
      }
   }

   private static void createAndShowGui() {
      AddTextToTextField mainPanel = new AddTextToTextField();

      JFrame frame = new JFrame("AddTextToTextField");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14867040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档