当前位置: 首页 > 知识库问答 >
问题:

在mac上,在Java中,keyPressed事件不会对某些键触发

谭玄天
2023-03-14

这是一个非常奇怪的问题,但我只是在JPanel中添加了一个简单的keyListener,它在keyPressed和KeyRelease上打印。通常它工作得很好,但在像'A'这样的某些键上,如果我在释放之前按住不放,在释放之后没有其他键会触发按下的键,直到我按住'D'这样的某些键。之后,它又回到了平常,除非我按下一个“坏”键,并保持太长时间。

最后一个注意,KeyRelease总是正确地触发,只是按下键失败了。

Edit2:我已经将代码简化为以下内容,它的行为仍然与上面描述的一样:

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;

public class Test {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setSize(800, 600);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

        frame.addKeyListener(new KeyListener() {

            @Override
            public void keyTyped(KeyEvent e) {

            }

            @Override
            public void keyPressed(KeyEvent e) {
                System.out.println("Pressed");
            }

            @Override
            public void keyReleased(KeyEvent e) {
                System.out.println("Released");
            }

        });
    }
}
JFrame frame = new JFrame("test");
frame.setSize(WIDTH, HEIGHT);
frame.setLocationRelativeTo(null);
frame.setLayout(null);
frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
frame.setResizable(false);

JLayeredPane panel = new JLayeredPane();
panel.setBounds(0, 0, WIDTH, HEIGHT);
panel.setLayout(null);


frame.add(panel);
KeyListener listener = new KeyListener() {

    public void keyTyped(KeyEvent e) {
        System.out.println("typed: "+e.getKeyCode());
    }

    @Override
    public void keyPressed(KeyEvent e) {
        System.out.println("pressed: "+e.getKeyCode());
    }

    @Override
    public void keyReleased(KeyEvent e) {
        System.out.println("released: "+e.getKeyCode());
        System.out.println();
    }

};
panel.addKeyListener(listener);
frame.addKeyListener(listener);
frame.setVisible(true);

共有1个答案

阎功
2023-03-14

我最近遇到了这个问题,这是因为当你按住某些键(允许你选择其他语言字符)时,MacOS会显示一个上下文菜单,而bug报告页面有一个很好的解决方案,对我来说很有效:

https://bugs.java.com/bugdatabase/view_bug.do?bug_id=jdk-8167263

若要禁用字符重音菜单并启用自动重复,请在命令提示符下键入以下内容:

defaults write -g ApplePressAndHoldEnabled -bool false
defaults write -g ApplePressAndHoldEnabled -bool true
 类似资料:
  • 问题内容: 我刚刚创建了一个Java井字游戏,我想弄清楚在特定条件下按下Enter键后如何运行方法,下面是一个示例… 问题答案: 根据要在何处捕获“ enter”键,可以使用(在诸如文本组件或按钮之类的组件上)或将键绑定附加到组件上 这将取决于所关注的组件。

  • 我是詹金斯/格里特的新手。我在试着把gerrit和Jenkins融合在一起。我有一个jenkins项目设置,当在我的git存储库中创建(push)变更集时会触发,该变更集由gerrit项目托管。主分支不接受直接推送。我使用以下命令推送到存储库。 git推原点头:参考/for/master 现在,当我做一个推动时,詹金斯项目不会自动启动。我可以用“查询和触发gerrit补丁”手动触发gerrit事件

  • 用户可以从datalist或can类型中选择一个项目,输入它自己的值。我通过JSON调用PHP脚本连接到数据库,以填充表单其余部分的其他信息。我希望当用户在列表输入中键入名称时(因此当内容模糊时),或者当用户单击DataList中的某个选项时,这会触发。 使用当输入失去焦点时会触发该函数,但当从数据列表中选择一项时,它也会等待“直到输入失去焦点,我希望事件立即触发” 使用单击datalist中的一

  • 我正在用Python编写一个带有Tkinter UI的程序。我想有一个没有标题栏的小窗口。此窗口必须接收键盘输入。我并不挑剔这是一个条目小部件的形式,还是仅仅绑定到KeyPress。 通常是禁用标题栏的方式。不幸的是,(除了在Windows中,这似乎阻止了许多事件被接收。我写了这段代码来说明问题: 这将创建一个小窗口(没有标题栏),当它接收到公共事件时,该窗口将打印这些事件的名称。我已经在Wind

  • 问题内容: 我正在开发一个文件上传控件,该控件通过ajax发布表单数据。 我在Chrome,Firefox,IE 11、10中具有此工作的跨浏览器。但是,在Microsoft Edge浏览器中,似乎未触发上载“进度”事件。 谁能指出原因并告诉我Edge是否可以解决? 请参见下面的JavaScript代码段和以下HTML。 JavaScript: HTML: 问题答案: 这是Edge 15的已知问题

  • 我有两个blob触发器,我想触发。一个有效,一个无效! 我使用Azure Storage Explorer来确保blob被上传到每个blob,< code>scanFiles永远不会触发,而< code>scanExports似乎总是会触发。 问题:什么会导致某些blob无法触发Azure函数?