检查是否按下了shift键

时间:2012-04-08 16:17:09

标签: java keyboard keyboardfocusmanager

我正在编写一个应用程序,应该在启动时检查是否按下了shift键。为此,我创建了一个小班,负责:

import java.awt.KeyEventDispatcher;
import java.awt.KeyboardFocusManager;
import java.awt.event.KeyEvent;

public class KeyboardListener {

    private static boolean isShiftDown;

    static {
        KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(
            new KeyEventDispatcher() {
                public boolean dispatchKeyEvent(KeyEvent e) {
                    isShiftDown = e.isShiftDown();
                    return false;
                }
            });
    }

    public static boolean isShiftDown() {
        return isShiftDown;
    }

}

但是,如果在应用程序启动时已按下shift键,则似乎无效。以下检查始终执行else案例。

if (KeyboardListener.isShiftDown()) {
    // ...
} else {
    // this always gets executed
}

如果在应用程序启动时已经按下了Shift键,是否有办法检查是否按下了Shift键?我知道这可以使用WinAPI,但我更喜欢Javaish的方式。

提前致谢!

3 个答案:

答案 0 :(得分:1)

似乎不可能,因为它要求应用程序轮询初始状态,而不是AWT / Swing使用的事件模型。

答案 1 :(得分:1)

清理您的编码风格可能有所帮助,我发现您的代码难以阅读。

您的程序可能不会听到程序在设计开始之前发生的转换,因为此转换已发送到父程序而不是它。

答案 2 :(得分:1)

我将此描述为黑客,但它确实解决了问题(有一些缺点),所以我想我会提到它是一种可能性。

您可以使用Robot类来模拟应用程序不关心的某些键的击键(可能是其中一个功能键)。注册KeyListener后立即运行此代码。您会看到一个关键事件,它会告诉您Shift是否已关闭。

警告:这对系统来说就像用户实际按下并释放F24(或您选择的任何键)一样。这可能会产生意想不到的副作用。

    (new Thread( )
    {
        @Override
        public void run( )
        {
            try
            {
                java.awt.Robot robot = new Robot();
                robot.delay( 100 );
                robot.keyPress( KeyEvent.VK_F24 );
                robot.keyRelease( KeyEvent.VK_F24 );
            }
            catch ( Exception e )
            {
            }
        }
    }).start( );