2014-04-01 34 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

相關問題