【问题标题】:Keylistener on jpanel won't work [duplicate]jpanel上的Keylistener不起作用[重复]
【发布时间】:2013-07-11 10:36:00
【问题描述】:

我正在尝试向我的 JPanel 添加一个 keylistener,但即使在此之后它也无法工作:

put.setFocusable(true);
    put.requestFocusInWindow();
    KeyboardHandler keyhandler=new KeyboardHandler();
    put.addKeyListener(keyhandler);
}
private class KeyboardHandler implements KeyListener{
    public void keyPressed(KeyEvent e) {
    System.out.println("OVDE ZZZ");
    if(e.getKeyCode()==17) ctrl=true;
        if(e.getKeyCode()==90) z=true;
        if(ctrl && z){
            if (UndoBrojac==0) JOptionPane.showMessageDialog(null, "You can't undo that");
            else{
                UndoBrojac--;
                put.setUndo(UndoBrojac);
            }
        }

}

public void keyReleased(KeyEvent e){
    if (e.getKeyCode()==17) ctrl = false;
    if (e.getKeyCode()==90) z = false;
}

    public void keyTyped(KeyEvent e) {}
}

我正在尝试添加 ctrl+z 但它不起作用。

【问题讨论】:

  • 你应该使用KeyEvent.VK_CONTROLKeyEvent.VK_Z 来避免魔法常量。
  • 这不是问题,它甚至不会得到按键
  • 对于 Swing,通常在基于 AWT 的较低级别 KeyListener 上使用键绑定。有关如何使用它们的详细信息,请参阅How to Use Key Bindings
  • 为什么会起作用?它需要组件具有焦点,我猜用你的话说,顶级容器正在获得焦点,所以按照已经建议使用 KeyBinding :-) @camickr 的这篇关于Motion using Keyboard 的帖子一定会让你感兴趣:-)
  • 嗯,这可能是因为您没有遵循答案 ;-) 我选择的副本(在投票结束时)提到了焦点问题并且您应该不 使用 keyListener - 那你为什么不从中学习,相应地更新你的方法然后回来?

标签: java swing jpanel keylistener


【解决方案1】:

一些有用的 cmets 建议使用Key Bindings。如here 所示,在Action 的上下文中将KeyEvent.VK_Z 指定为ACCELERATOR_KEY 特别容易。如果您要撤消对文本组件的更改,请参阅How to Write an Undoable Edit Listener;那里引用的TextComponentDemo 说明了一个典型的UndoAction

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 2018-05-18
    • 1970-01-01
    • 2013-10-22
    • 2015-06-24
    • 2023-04-03
    相关资源
    最近更新 更多