【问题标题】:Java: How do you actually use KeyListener?Java:您如何实际使用 KeyListener?
【发布时间】:2013-12-21 19:25:20
【问题描述】:

我一直在到处寻找如何从键盘获取输入。我可以找到大量资源来了解如何修改 keylistener 在按键上的操作,我可以找到如何将其添加到摇摆文本行,以及许多其他关于它的杂项。但我不知道如何将它实际放入文件中并使用它。

现在我只想有一个主类,它的主函数只有一个无限循环,每次你按下一个键它都会打印“键_已被按下”。我该怎么做?

我制作了一个 MyKeyListener,它扩展了 KeyAdapter,其中包括 keyPressed 下字符串的 system.out.print(我认为这是可行的)。但是我在主类中放了什么来实际使用它呢?包括它和初始化是不够的。

这是我的关键监听器文件:`

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
public class GKeyListener extends KeyAdapter {

public void keyPressed(KeyEvent e){
    System.out.println("Key Pressed: " + e.getKeyChar());
}
public void keyReleased(KeyEvent e){
    System.out.println("Key Released: " + e.getKeyChar());
}
public void keyTyped(KeyEvent e){
    System.out.println("Key Typed: " + e.getKeyChar());
}

这是一个我正在使用但不知道从哪里去的主文件: 导入 java.awt.KeyEventDispatcher; 导入 java.awt.KeyboardFocusManager; 导入 java.awt.event.KeyEvent;

public class tempMain {
public static void main(String[]  args){
    while(true){
        GKeyListener listen =new GKeyListener();
        //addKeyListener(listen);
    }
}

【问题讨论】:

标签: java


【解决方案1】:

这段代码的作用:

public class tempMain {
public static void main(String[]  args){
    while(true){
        GKeyListener listen =new GKeyListener();
        //addKeyListener(listen);
    }
}

是重复创建一个KeyListener,数千次​​trong>!它对使用的 KeyListener 没有任何作用,并在只需要一个时再次创建数千个 KeyListener。相反,您应该考虑以下几点:

  • 首先创建一个 GUI。如果没有 Swing 或 AWT GUI,KeyListener 将无法工作并且没有意义。更喜欢使用 Swing 而不是 AWT。
  • Single KeyListener 添加到具有焦点的 GUI 组件中。
  • 认真考虑使用键绑定代替 KeyListener,以获得更大的灵活性和代码可重用性。

编辑
您在评论中声明,

但如果不添加文本字段,我不确定如何实际调用侦听器以使其实际存在并正常工作

  • 郑重声明,您永远不应将 KeyListener 与 JTextComponent(如 JTextField)一起使用,因为有更好、更安全的方法来捕获这些组件中的输入。
  • 听起来好像您想要一个通用的操作系统范围的键侦听器。如果是这样,那么您就找错了树,因为 Java 不容易支持这一点。
  • 对于此类功能,您需要使用 JNA 或 JNI 绑定到操作系统。
  • 或使用为您的应用提供此功能的第三方库
  • 或绑定到 AutoIt 等实用程序,为您的应用提供此功能。

【讨论】:

    【解决方案2】:

    KeyListener 是 Java AWT GUI 框架的一个类。它是 AWT 事件处理系统的一部分,例如用于捕获文本输入组件(如TextArea、TextField等)的按键事件。

    没有组件,使用 KeyListener 没有多大意义。

    如果您想做一些实验,您可以使用KeyboardFocusManager 在不使用文本输入组件的情况下捕获键输入。此示例显示了两者,将 KeyListener 绑定到文本组件并使用全局 KeyboardFocusManager

    public class KeyExample extends JFrame {
        public KeyExample() {
            JTextField jTextField = new JTextField(20);
            jTextField.addKeyListener(new KeyAdapter() {
                @Override
                public void keyTyped(KeyEvent e) {
                    System.out.println("KeyListener: " + e.getKeyChar());
                }
            });
            add(jTextField);
            pack();
            setDefaultCloseOperation(EXIT_ON_CLOSE);
        }
    
        public static void main(String[] args) {
            KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher() {
                @Override
                public boolean dispatchKeyEvent(KeyEvent e) {
                    System.out.println("KeyEventDispatcher: " + e.getKeyChar());
                    return false;
                }
            });
            new KeyExample().setVisible(true);
        }
    }
    

    您应该只在极少数情况下使用KeyboardFocusManager。通常,使用KeyListener 处理事件就足够了。

    【讨论】:

      猜你喜欢
      • 2010-12-17
      • 2012-05-23
      • 1970-01-01
      • 2018-09-25
      • 2017-02-19
      • 2017-11-18
      • 1970-01-01
      • 2013-01-15
      • 2012-06-08
      相关资源
      最近更新 更多