【问题标题】:Check whether shift key is pressed检查是否按下了shift键
【发布时间】:2012-04-09 00:44:05
【问题描述】:

我正在编写一个应用程序,它应该在启动时检查是否按下了 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 键,有没有办法检查它是否被按下?我知道使用 WinAPI 可以做到这一点,但我更喜欢 Java 的方式。

提前致谢!

【问题讨论】:

    标签: java keyboard keyboardfocusmanager


    【解决方案1】:

    我认为这是一种 hack,但它确实解决了问题(有一些缺点),所以我想我会提到它作为一种可能性。

    您可以使用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( );
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        您的程序可能不会监听在程序启动之前发生的转变,因为这个转变是发送给父程序而不是发送给它的。

        【讨论】:

        • 对不起,这是我第一个使用 GUI 框架的 Java 程序。我该怎么做才能使我的代码更具可读性?
        • 基本上你在一行中做了太多的操作,使用更多的变量和更少的匿名实体。请记住,代码是供人们阅读的,而不是计算机,您的优化编译器将主要负责使其高效运行。
        猜你喜欢
        • 1970-01-01
        • 2015-12-12
        • 1970-01-01
        • 1970-01-01
        • 2012-02-05
        • 2012-11-12
        • 1970-01-01
        • 2022-01-03
        • 1970-01-01
        相关资源
        最近更新 更多