java中toolkit.getdefaulttoolkit()_java-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机器上,使用Java 1.7.0_45时,它会根据num lock键的初始状态打印…….或*********,但绝不会像.. **.**就像我期望的那样,在切换按钮时.

解决方法:

>在没有visible Java container的纯Java中没有正确的方法,并且也将焦点放在Windows中,KeyLoggers在Java中被阻止,

>(不可能是主要问题,但是也不会打印任何内容)来自util.Timer的循环不在EDT中,更多内容在Concurency in Swing中,Toolkit来自AWT软件包,EDT问题也适用于大多数AWT软件包

>为我工作(在满足前两点的情况下..),出于测试目的,请在此程序执行期间尝试将焦点移至Windows OS中的另一个活动窗口

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

}

}

标签:keyboard,swing,awt,java

来源: https://codeday.me/bug/20191121/2055393.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值