在除动作事件之外的其他事件中按下了什么键(修饰符)?

时间:2014-05-09 20:06:32

标签: java swing listener keystroke

我想知道是否有任何方法可以确定是否在不使用InputEvent的情况下按下任何键或鼠标按钮。

例如:我的应用程序没有焦点但是当它获得焦点时我想知道是否按下了Ctrl键。这适用于大多数条件,但如果通过点击标题栏获得焦点则不会(这正是我正在寻找的)。

或者:我开始拖动一个窗口,我想知道在此拖动过程中是否按下或释放了Ctrl键。

我已经尝试过按键击键并使用AWTEventListener,但这没有用,因为没有关于按下键的信息。

有没有办法从Swing中获取按键? 就我搜索而言,我认为没有,因为修改器直接从OS生成的事件(例如XWindow中的getModifiers())收集在工具箱中,但也许我错了。

有这样的方式:GlobalKeyListener但这很复杂,而且依赖于操作系统。

3 个答案:

答案 0 :(得分:1)

标题栏不是Swing组件,因此在使用Swing侦听器时无法接收事件。

如果你想监听事件,那么你需要使用带有Swing装饰的JFrame:

JFrame frame = new JFrame();
frame.setUndecorated(true);
frame.getRootPane().setWindowDecorationStyle(JRootPane.FRAME);
frame.getRootPane().addMouseListener(...);

答案 1 :(得分:0)

如何监听密钥并设置一些布尔变量。然后,当您的应用程序获得焦点时,您只需检查布尔值是否已设置。

例如

private boolean isCtrlDown;
public void keyPressed(KeyEvent e) {
    if(e.getKeyCode() == KeyEvent.VK_CONTROL) {
        isCtrlDown = true;
    }
}
public void keyReleased(KeyEvent e) {
   if(e.getKeycode() == KeyEvent.VK_CONTROL) {
       isCtrlDown = false;
   }
}


public void focusGained(FocusEvent e) {
     if(isCtrlDown) {
         // Do what you wanted to do
     }
}

答案 2 :(得分:0)

我找到的唯一实际可能性是使用https://code.google.com/p/jnativehook/

这会使用JNI添加本机侦听器。