问题描述
我遇到的问题是Toolkit.getDefaultToolkit().getLockingKeyState(...)
从不更新.第一次查询时它会正确报告,然后当我使用键盘更改状态时,更改将永远不会反映出来.
I have the problem that Toolkit.getDefaultToolkit().getLockingKeyState(...)
never updates. It reports correctly the first time I query it, then when I change the state using keyboard, the change is never reflected.
这是设计使然(在API文档中似乎不是这样),错误或我的代码中有东西吗?
Is this by design (doesn't seem so in the API doc), a bug, or is there something with my code?
这是一个简短的,独立的示例来说明问题:
Here's a short, self-contained example to demonstrate the issue:
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机器上,使用Java 1.7.0_45时,它会根据num lock键的初始状态打印.......
或*********
,但不会像我期望的那样混合..**.**
切换按钮时.
When run, on my Windows machine, using Java 1.7.0_45, it prints either .......
or *********
depending on the initial state of the num lock key, but never a mix like ..**.**
like I expect it to, when toggling the button.
推荐答案
-
没有可见的Java容器,并且也将焦点放在Windows中,因此KeyLogger在Java中被阻止,
there isn't a correct way in plain Java without visible Java container and with focus in windows too, KeyLoggers are blocked in Java,
(可能不是主要问题,但也不会打印任何内容)从util.Timer退出EDT,更多信息请参见 Swing的一致性,工具包来自AWT软件包,EDT问题也适用于大多数AWT软件包
(could not be main issue, but nothing will be printed too) loop from util.Timer is out of EDT, more in Concurency in Swing, Toolkit is from AWT package, EDT issue is valid for most of AWT packages too
为我工作(在满足前两点的情况下,..),用于测试目的是尝试在执行此程序之前将焦点移到Windows OS中的另一个活动窗口中
work for me (in the case that previous two points, requirements are met..), for testing purpose to try move focus to another active window in Windows OS durring this program execution
代码
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);
}
}
这篇关于Toolkit.getDefaultToolkit().getLockingKeyState(...)在程序执行期间从不更新的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!