【问题标题】:Using keyListeners with multiple threads / KeyBinding使用多线程的 keyListeners / KeyBinding
【发布时间】:2019-01-22 01:20:28
【问题描述】:

我正在尝试制作一个非常简单的游戏,但它仍然可能需要同时使用大约 8 个键。

使用 keyListener,我可以花大约 3-4 个延迟,这是我不想要的。

我不知道如何使用 keyBinding,我认为它可以解决我的问题。 (请不要只放这个链接,我已经看过它以及其他来源:https://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html

我的第一个猜测是向 keyListener 添加线程,但我不知道如何做到这一点,查找它并没有给我很好的答案。

private void makeKeyListeners() {
    f.addKeyListener(new KeyListener() {
        @Override
        public void keyTyped(KeyEvent e) {}

        @Override
        public void keyPressed(KeyEvent e) {
            int key = e.getKeyCode();
            switch (key) {. . .}
        }

        @Override
        public void keyReleased(KeyEvent e) {
            int key = e.getKeyCode();
            switch (key) {. . .}
        }
    });
}

使用这个,我没有得到足够的输入(无法检测到同时按下的 8 个键)

所以我最大的问题是;如何一次从 8 个以上的键中获取输入?

如果解决此问题的最佳方法是使用 keyBindings,您能帮我一个忙并深入解释一下吗?

【问题讨论】:

  • 上面的代码没有记录所有八次按键,这让我难以置信。我们可能需要查看其余代码,并提供一些输出来说明为什么您认为没有多次按键。 (P.S. Swing 不是线程安全的,所以你不能用多线程来解决这个问题。游戏的多线程很棘手,无论如何用户输入应该是一个线程完成的。)
  • “我的第一个猜测是向 keyListener 添加线程,” 好吧,这是个坏主意,因为 Swing 是单线程的,并且事件将在事件调度线程上传递.我鼓励使用键绑定,因为它解决了KeyListener 的主要问题之一——焦点问题。假设您不需要同时激活所有键,我将使用 Set,它定义了哪些键被激活,并允许游戏“主循环”简单地检查它以确定需要采取哪些操作
  • “无法检测到同时按下的 8 个键” 这不是 Swing 的问题,而是硬件的限制
  • 您可能想阅读this 并深入了解键盘和驱动程序的工作原理
  • this了解更多详情

标签: java multithreading keylistener


【解决方案1】:

这是硬件问题。我去了http://blog.controlspace.org/2010/08/n-key-rollover-what-it-is-and-how-to.html?m=1(MadProgrammer 的评论)并测试了我拥有的 3 种不同的键盘,它们的表现都不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多