Java 检查换档键是否按下

Java 检查换档键是否按下,java,keyboard,keyboardfocusmanager,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 { K

我正在编写一个应用程序,启动时应该检查是否按下了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可以做到这一点,但我更喜欢Javaish方式


提前谢谢

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

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


您的程序可能不会侦听在程序按设计启动之前发生的转换,因为此转换是发送给父程序而不是发送给它的。

我将此描述为一种黑客行为,但它确实解决了问题(有一些缺点),因此我想我会将其作为一种可能性提及

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

很抱歉,这是我第一个使用GUI框架的Java程序。我该怎么做才能使我的代码更具可读性?基本上,你在一行中做了太多的操作,使用了更多的变量和更少的匿名实体。请记住,代码是供人们阅读的,而不是供计算机阅读的,您的优化编译器将主要负责使其高效运行。