![](/img/trans.png)
[英]How can I set a Component focused whenever the JFrame is focused (e.g. by clicking or with Alt+Tab)?
[英]How can a KeyListener detect key combinations (e.g., ALT + 1 + 1)
如何让我的自定义KeyListener
侦听ALT
(或CTRL
与此相关)+ 多个其他键的组合?
假设我希望应用程序执行 11 种不同的操作,具体取决于按下的按键组合。 ALT + 0
- ALT + 9
显然不会造成任何问题,而对于ALT + 1 + 0
(或“ALT+10”,因为它可以在帮助文件或类似文件中描述)我无法在任何地方找到好的解决方案网络(或在我的脑海中)。 我不相信 这个带有计时器的解决方案是唯一可能的方法。
预先感谢一百万的任何建议!
编辑:动作 0-9 + 动作 10 = 11 个动作。 谢谢@X-零。
您不应将 KeyListener 用于此类交互。 而是使用键绑定,您可以在Java 教程 中阅读相关内容。 然后您可以使用InputEvent掩码来表示何时按下各种修饰键。 例如:
// Component that you want listening to your key
JComponent component = ...;
component.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE,
java.awt.event.InputEvent.CTRL_DOWN_MASK),
"actionMapKey");
component.getActionMap().put("actionMapKey",
someAction);
有关获取KeyStroke 时可以使用的不同代码,请参阅KeyStroke的 javadoc。 这些修饰符可以组合在一起来表示各种键组合。 如
KeyStroke.getKeyStroke(KeyEvent.VK_SPACE,
java.awt.event.InputEvent.CTRL_DOWN_MASK
| java.awt.event.InputEvent.SHIFT_DOWN_MASK)
表示Ctrl + Shift
键的时间。
编辑:正如已经指出的那样,这并不能回答你的问题,而应该只是作为一些好的建议。
为此,您可以通过组合某些东西来使用KeyListener
。 看看下面的例子,它应该放在一个重写的keyPressed(KeyEvent e)
方法中。
if (e.isControlDown() && e.getKeyChar() != 'a' && e.getKeyCode() == 65) {
System.out.println("Select All");
}
当按下 Ctrl + a时,将显示Select All
字符串。 方法e.isControlDown()
检查Ctrl键是否被按下。 同样, Alt键组合可以通过使用e.isAltDown()
方法使用相同的方法完成。
这背后的逻辑是, e.getKeyChar()
返回按键的字符 & e.getKeyCode()
返回其 ASCII 代码。 当按住 Ctrl 时, e.getKeyChar()
不会返回a
并且e.getKeyCode()
将是相同的65
。 希望你明白这一点。 随意询问更多。
ALT + 1 + 0(或“ALT+10”,因为它可以在帮助文件或类似文件中描述)
似乎与(来自您的评论之一)发生冲突:
例如,如果用户想要更改第 11 列(称为“10”)中的数据,他/她会按 ALT + 1 + [同时放开 ALT 和 1] 0。
假设 ALT+10 表示“按下 ALT,按下并释放 1,按下并释放 0,释放 ALT”,我建议尝试以下操作:
在 keyPressed 中,监听 ALT 键,激活布尔标志 isAltPressed,并创建一个缓冲区来保存发生的按键操作(比如一个字符串)。 在 keyTyped 中,如果 isAltPressed 处于活动状态,则将键代码附加到缓冲区。 在 keyReleased 中,再次监听 ALT,打开一个条件查询缓冲区并执行操作。
public void keyPressed (KeyEvent e){
if (e.getKeyCode() == KeyEvent.VK_ALT){
buffer = ""; //declared globally
isAltPressed = true; } //declared globally
}
public void keyTyped (KeyEvent e){
if (isAltPressed)
buffer.append (e.getKeyChar());
}
public void keyReleased (KeyEvent e){
if (e.getKeyCode() == KeyEvent.VK_ALT){
isAltPressed = false;
if (buffer.equals (4948)) //for pressing "1" and then "0"
doAction();
else if (buffer.equals(...))
doOtherAction();
...
}//if alt
}
import java.awt.*;
import java.awt.event.*;
class KDemo
{
public static void main(String args[])
{
Frame f = new Frame();
f.setSize(500,500);
f.setVisible(true);
f.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
AWTKeyStroke ak = AWTKeyStroke.getAWTKeyStrokeForEvent(e);
if(ak.equals(AWTKeyStroke.getAWTKeyStroke(KeyEvent.VK_F4,InputEvent.ALT_MASK)))
{
System.exit(0);
}
}
});
}
}
我建议不要使用组合键,而是在窗口isVisible()
和焦点时考虑一些输入字段。 该字段可以隐藏,如 Windows 的文件资源管理器隐藏文件名搜索(输入目录,键入文件名并集中对应),或者是可见的,如在 Ubuntu 中。
组合键不是为包含多个键而不是修饰符而设计的,尽管您可以实现这一点。
我认为我正在使用一种更简单的方法。 如果 KeyEvent 是 ev 那么如果你调查:
(int)ev.getKeyChar()
你发现ctrl - a是 1, ctrl - b是 2 等等。 我想使用ctrl -s进行保存。 所以我只是使用:
(((int)ev.getKeyChar())==19)
检测它。 不知道为什么,但它工作正常,而:
ev.isControlDown() && ev.getKeyChar()=='s'
才不是。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.