gpt4 book ai didi

java - 大写锁定检测在重新聚焦后返回错误值

转载 作者:行者123 更新时间:2023-11-30 10:01:17 25 4
gpt4 key购买 nike

我的 JFrame 必须检测大写锁定是打开还是关闭。如果我关注窗口,一切正常,程序通过 KeyListener 检测大写锁定状态的变化。当窗口最小化时,我无法检查大写锁定状态,所以我在用户重新聚焦窗口后检查状态。但是随后检查返回我获得的最后一个 Caps lock 状态,而不是当前状态。

JFrame frame;

public example() {
frame = new JFrame();
frame.setSize(400, 400);
frame.setVisible(true);

frame.addWindowFocusListener(new WindowFocusListener() {
@Override
public void windowGainedFocus(WindowEvent e) {
System.out.println("Caps Lock Status: " + Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_CAPS_LOCK));
}

@Override
public void windowLostFocus(WindowEvent e) {
// nothing to do
}
});

}

如果我的大写锁定在窗口打开时关闭,而我在窗口未聚焦时打开大写锁定。然后我希望在窗口重新聚焦后从程序中得到一个 true 。

感谢各种建议,谢谢!

最佳答案

正如@camickr 在评论部分正确指出的那样,它与一个错误有关。可能与 Windows 工具包有关。为了使这项工作我尝试了一些事情,唯一稳定的(测试了大约 100 次)是用一些 sleep 按下/松开 CAPS LOCK 2 次(一次改变其状态,一次将其恢复)。之间的时间,然后从工具包中询问值。为了实现这一点(让线程 hibernate ),我们需要使用 SwingWorker。 .我创建了一个 SwingWorker需要 Consumer<Boolean> 的类(class)争论并在结束时接受它。 Boolean消费者中的值表示大写锁定是否打开/关闭。

看看:

public class CapsLockDetectWorker extends SwingWorker<Boolean, Void> {
private Consumer<Boolean> consumer;
private static final int CAPS_LOCK = KeyEvent.VK_CAPS_LOCK;

public CapsLockDetectWorker(Consumer<Boolean> consumer) {
this.consumer = consumer;
}

@Override
protected Boolean doInBackground() throws Exception {
Robot robot = new Robot();
robot.keyPress(CAPS_LOCK);
robot.keyRelease(CAPS_LOCK);
Thread.sleep(3);
robot.keyPress(CAPS_LOCK);
robot.keyRelease(CAPS_LOCK);
Thread.sleep(3);
return Toolkit.getDefaultToolkit().getLockingKeyState(CAPS_LOCK);
}

@Override
protected void done() {
try {
Boolean isCapsOn = get();
consumer.accept(isCapsOn);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}

以及如何使用它的示例:

public class CapsLockDetection {
private JFrame frame;

public CapsLockDetection() {
frame = new JFrame();
frame.setSize(400, 400);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.addWindowFocusListener(new WindowFocusListener() {
@Override
public void windowGainedFocus(WindowEvent e) {
new CapsLockDetectWorker(b -> {
System.out.println("ENABLED CAPS LOCK:" + b);
}).execute();
}

@Override
public void windowLostFocus(WindowEvent e) {
// nothing to do
}
});

}

public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
new CapsLockDetection();
});
}
}

当然,如果你的电脑有caps lock带灯的按钮(或者你的键盘某处有一个),你会看到它闪烁(关闭/打开)......

我知道这看起来很傻,但我不认为你会找到更好的东西。

关于java - 大写锁定检测在重新聚焦后返回错误值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57512151/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com