2014-04-01 35 views
2

正如标题所示,我遇到Toolkit.getDefaultToolkit().getLockingKeyState(...)从不更新的问题。它在我第一次查询时报告正确,然后当我使用键盘改变状态时,变化永远不会反映出来。Toolkit.getDefaultToolkit()。getLockingKeyState(...)在程序执行期间从不更新

这是有意设计的(在API文档中看起来并不如此),一个错误,或者是否有我的代码?

这里是一个简短的,自包含的例子来说明这个问题:

public class LockingStateIssue { 
    public static void main(String[] args) { 
     Timer timer = new Timer(); 
     timer.scheduleAtFixedRate(new TimerTask() { 
      @Override public void run() { 
       if (Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_NUM_LOCK)) { 
        System.out.print("*"); 
       } else { 
        System.out.print("."); 
       } 
      } 
     }, 0, 200); 
    } 
} 

运行时,我的Windows机器上,使用Java 1.7.0_45,它打印无论是.......*********取决于初始状态num lock键,但从来没有像我期望的那样混合像..**.**,当切换按钮时。

+1

只是测试它。你是对的。我也得到相同的行为,也为VK_CAPS_LOCK。 – datahaki

+0

[我怀疑没有AWTEventListener返回合理的值](http://bugs.java.com/view_bug.do?bug_id=4414164) – mKorbel

+0

听起来像是一个bug,或者如果按照设计,它应该在API文档 – haraldK

回答

3
  1. 没有在普通的Java以正确的方式,而不visible Java container,并与重点窗口过,键盘记录器被阻挡在Java中,

  2. (不可能是主要的问题,但没有也会被显示出来)从util.Timer环超出EDT,更在Concurency in Swing,工具包是从AWT组件,EDT问题是适合大多数AWT包太

  3. 对我的工作(在以前的两个点,要求的情况下遇到..),用于测试目的,试图将焦点移至Windows操作系统中的另一个活动窗口这个程序执行

代码

import java.awt.AWTEvent; 
import java.awt.EventQueue; 
import java.awt.Toolkit; 
import java.awt.event.AWTEventListener; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import javax.swing.AbstractAction; 
import javax.swing.Action; 
import javax.swing.JFrame; 

public class ToolkitAndNumLock { 

    private javax.swing.Timer timer = null; 
    private JFrame frame = new JFrame(); 

    public ToolkitAndNumLock() { 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(400, 300); 
     frame.setVisible(true); 
     start(); 
     //uncomment Toolkit.getXxx listening a KeyEvents, you can (start();) block SwingTimer 
     //Toolkit.getDefaultToolkit().addAWTEventListener(listener, AWTEvent.KEY_EVENT_MASK); 
    } 
    AWTEventListener listener = new AWTEventListener() { 
     @Override 
     public void eventDispatched(AWTEvent event) { 
      if (event instanceof KeyEvent) { 
       KeyEvent ke = (KeyEvent) event; 
       if (ke.getID() == KeyEvent.KEY_PRESSED) { 
        if (ke.getKeyCode() == KeyEvent.VK_CAPS_LOCK) { 
         System.out.println("CapsLock Pressed"); 
        } 
        if (ke.getKeyCode() == KeyEvent.VK_SCROLL_LOCK) { 
         System.out.println("ScrollLock Pressed"); 
        } 
        if (ke.getKeyCode() == KeyEvent.VK_NUM_LOCK) { 
         System.out.println("NumLock Pressed"); 
        } 
       } 
      } 
     } 
    }; 

    private void start() { 
     timer = new javax.swing.Timer(2500, updateCol()); 
     timer.setRepeats(true); 
     timer.start(); 
    } 

    public Action updateCol() { 
     return new AbstractAction("text load action") { 
      private static final long serialVersionUID = 1L; 
      private Boolean bol = true; 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       if (Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_NUM_LOCK)) { 
        System.out.println("true"); 
       } else { 
        System.out.println("false"); 
       } 
       if (bol) { 
        Toolkit.getDefaultToolkit().setLockingKeyState(KeyEvent.VK_NUM_LOCK, true); 
       } else { 
        Toolkit.getDefaultToolkit().setLockingKeyState(KeyEvent.VK_NUM_LOCK, false); 
       } 
       bol = !bol; 
      } 
     }; 
    } 

    public static void main(String args[]) { 
     Runnable runner = new Runnable() { 
      @Override 
      public void run() { 
       new ToolkitAndNumLock(); 
      } 
     }; 
     EventQueue.invokeLater(runner); 
    } 
} 
+0

对于'EventQueue.invokeLater'为+1;注意'getLockingKeyState'在Mac OS X上抛出'UnsupportedOperationException'。 – trashgod

+0

@trashgod请给我好奇心setLockingKeyState(KeyEvent,true/false)在MacOSX上工作 – mKorbel

+1

同时抛出'UnsupportedOperationException'。 – trashgod

相关问题