2012-04-08 159 views
2

我正在编写一个应用程序,该应用程序在启动时应检查是否按下了切换键。对于我创建了一个小的类,它负责的是:检查是否按下了切换键

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的方式。

在此先感谢!

回答

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(); 
1

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

1

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

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

+0

对不起,这是我第一个使用GUI框架的Java程序。我能做些什么来使我的代码更具可读性? – haiyyu 2012-04-08 16:53:17

+0

基本上你在一行中做了太多的操作,使用更多的变量和更少的匿名实体。记住代码是让人们阅读而不是计算机,你的optomizing编译器将主要能够照顾使它有效地运行。 – awiebe 2012-04-08 18:02:21

相关问题