如何让我的自定义监听(或)+多个其他键的组合?
假设我有11个不同的操作,我希望根据按下的键的组合执行这些操作。显然, - 都没有任何问题,但对于(或类似“ALT + 10”的描述),我在网上(或自己的思考中)找不到好的解决方案。 我并不确定这个计时器解决方案是唯一可行的方法。
非常感谢提前的任何建议!
编辑:动作0-9 + 动作10 = 11个动作。感谢@X-Zero。
如何让我的自定义监听(或)+多个其他键的组合?
假设我有11个不同的操作,我希望根据按下的键的组合执行这些操作。显然, - 都没有任何问题,但对于(或类似“ALT + 10”的描述),我在网上(或自己的思考中)找不到好的解决方案。 我并不确定这个计时器解决方案是唯一可行的方法。
非常感谢提前的任何建议!
编辑:动作0-9 + 动作10 = 11个动作。感谢@X-Zero。
在这种交互方式中,您不应该使用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的javadoc,了解获取KeyStroke时可用的不同代码。这些修饰符可进行OR操作以表示各种键的组合,例如:
KeyStroke.getKeyStroke(KeyEvent.VK_SPACE,
java.awt.event.InputEvent.CTRL_DOWN_MASK
| java.awt.event.InputEvent.SHIFT_DOWN_MASK)
表示Ctrl + Shift
键被按下的时刻。
编辑:正如已经指出的,这并不是回答您问题的方法,而应该只作为一些好的建议。
KeyListener
时遇到的焦点问题。 - s.dJComponent.WHEN_IN_FOCUSED_WINDOW
。 - mKorbel您可以通过结合某些东西使用 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 键。同样地,可以通过使用 e.isAltDown()
方法来检测 Alt 键组合。
这背后的逻辑是,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
}
我认为有一个更简单的方法,我正在使用。如果KeyEvent是ev,那么如果你调查一下:
(int)ev.getKeyChar()
(((int)ev.getKeyChar())==19)
检测它。不知道为什么,但它可以正常工作,而:
ev.isControlDown() && ev.getKeyChar()=='s'
不是。
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 中一样。
ALT10
实际上是第11个操作... 我通常也会试图避免需要两只手按下的东西(因为1和0通常位于键盘的两端)- 尝试使用不同/额外的修改键代替。此外,如果您尝试添加另一个热键,则不能使用ALT11
... - Clockwork-Museint
标题的列上调用。例如,如果用户想要更改第11列(称为“10”)中的数据,则会按下ALT
+1
+ [同时释放ALT
和1
]0
。我可以想象使用另一个键,如Shift
或类似键,而不是使用ALT
键。 - s.dALT + 1 + 1
(或者甚至是ALT + 1 + 1 + 1
)然后弹出窗口出现以更新表格中的另一行中的数据。ALT + X
键组合保留用于在应用程序中“调用列”,因此我不需要担心“交叉使用”。 - s.d