如何在 Java 中使用 keyTyped?

Posted

技术标签:

【中文标题】如何在 Java 中使用 keyTyped?【英文标题】:How do I use keyTyped in Java? 【发布时间】:2018-01-20 09:49:40 【问题描述】:

我曾经使用下面的扫描器类通过 cmd 提示符监听用户的输入,但我试图让 Java 应用程序通过使用 keyTyped 方法来监听文本。

public static void main(String[] args) throws IOException 
    new AsteroidsGame();
    InputStream inputstream = new InputStream() 

        @Override
        public int read() throws IOException 
            return 0;
        
    ;
    try 
        FileOutputStream output = new FileOutputStream("HighScore.txt",true);
        Scanner input = new Scanner(System.in);
        PrintStream printStream = new PrintStream(output);
        printStream.println(input.next() + " " + points);
        printStream.close();
        System.out.println("Success!");
    
    catch(IOException e)
        System.out.println(e);
    
 

我不知道如何处理让它监听击键并将字母组合成一个单词的方法。 (这是为游戏获取人名的一种方式)

@Override

public void keyTyped(KeyEvent e)       
if(lives == 0)
    
        e.getKeyCode() = KeyEvent.???
    

任何建议都将不胜感激,因为 Java 库和 Internet 的其他部分在示例或帮助方面提供的很少。

【问题讨论】:

关键监听器/事件用于 Swing GUI,而不是控制台。 KeyEvent 的完全限定名称是什么? 对不起,我没有说清楚。这是一个摆动 GUI。它是一款名为 asteroids 的游戏,这是我在玩完游戏后尝试获取用户姓名的尝试。至于名字,那是我的问题,我不知道我需要在该行中输入什么内容才能接受有人输入他们的名字。 如果这是一个 Swing GUI,您没有显示任何组件的使用。你在画什么游戏对象?哪个组件应该接收名称?为什么不使用普通的文本字段?小心关键听众,他们可能会给你带来焦点问题,请参阅***.com/questions/22741215/…。 查看本页底部的最新帖子 这不是一个论坛,答案没有顺序(我可以通过投票来排序)所以最新的并不总是在底部。任何其他信息都通过editing 进入您的问题,而不是通过发布答案(这将被删除,因为它不是答案)。 【参考方案1】:

当按下可以转换为有效 Unicode 字符的文本键时,它会生成 keyTyped 事件。我们可以抓住它。向上、向下等键可以通过 e.getKeyCode() 事件类型进行处理。

public class SimpleKeyListener implements KeyListener 

    StringBuilder sb = new StringBuilder();

    @Override
    public void keyTyped(KeyEvent e) 
        sb.append(e.getKeyChar());
        System.out.println(sb.toString());
    

    @Override
    public void keyPressed(KeyEvent e) 
    

    @Override
    public void keyReleased(KeyEvent e) 
        if(e.getKeyCode() == KeyEvent.VK_UP) 
            System.out.println("UP");
         else if(e.getKeyCode() == KeyEvent.VK_DOWN) 
            System.out.println("DOWN");
        
    

这是一个测试它的 hello world:

public class HelloWorldSwing 
    private static void createAndShowGUI() 
        JFrame frame = new JFrame("Frame");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.addKeyListener(new SimpleKeyListener());

        JLabel label = new JLabel("Hello Swing");
        frame.getContentPane().add(label);
        frame.pack();
        frame.setVisible(true);
    

    public static void main(String[] args) 
        javax.swing.SwingUtilities.invokeLater(new Runnable() 
            public void run() 
                createAndShowGUI();
            
        );
    

【讨论】:

我正在尝试你所做的。我会告诉你进展如何。 @Thereisnospoon 你必须accept the answer if this help you【参考方案2】:

如果你需要一个普通的监听器,那么你可以在任何 java 教程中找到它

如果您需要自定义侦听器,您可以在此处查看: Create a custom event in Java

它有一个关于自定义监听器的好例子

【讨论】:

感谢您的建议。【参考方案3】:

您需要一个扩展 KeyAdapter 类的子类,这使您可以访问 KeyAdapter 类中的keyPressed 方法,然后您可以覆盖该方法以在程序中执行您需要的操作。 KeyEvent e 是 keyPressed 方法的一个参数,该方法具有 getter getKeyCode,它根据按下的键 See simple tutorial here 返回一个特定的 int。所以你的代码就是这样的:

public class KL extends KeyAdapter 
    int k = 0;
    @Override
    public void keyPressed(KeyEvent e) 
        if (lives == 0) 
            k = e.getKeyCode();
        
    

Java 为 keyCodes 内置了常量,因此您可以根据需要轻松使用它们,例如左键的 int 是KeyEvent.VK_LEFT

在chapter 6 of Eck's excellent free text查看对此的更详细解释和KeyEvent听众的解释

【讨论】:

谢谢。感谢您的帮助。

以上是关于如何在 Java 中使用 keyTyped?的主要内容,如果未能解决你的问题,请参考以下文章

JAVA坦克大战项目练习日4

我什么时候会使用java Collections的singletonMap方法?

如何在cocoa中模拟mac媒体密钥

如何在模拟器上显示地图

Golang教程:Map

GoLang基础数据类型---字典