当前位置: 首页 > 面试题库 >

Toolkit.getDefaultToolkit()。getLockingKeyState(…)在程序执行期间从不更新

壤驷高洁
2023-03-14
问题内容

我有一个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键的初始状态进行打印,但是..**.**在切换按钮时,不会像我期望的那样混合打印。


问题答案:
  1. 在普通Java中,没有可见的Java容器也没有正确的方法,而在Windows中也有焦点,KeyLoggers在Java中被阻止,

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

  3. 为我工作(在满足前两点的情况下,..),用于测试目的是尝试在此程序执行期间将焦点移到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);
    }
}


 类似资料:
  • 问题内容: 我为我的一个脚本创建了一个小GUI。一切都很好。 当我单击一个按钮时,它会启动一个很大的功能,该功能正在解析某些网站中的许多数据。 但是,一旦我单击了Button,程序就会冻结,直到该功能完全运行为止。一切正常,但是为什么我的GUI在执行功能时冻结了。我想打印一个进度条,但这是不可能的。 这是程序的一部分: 在执行Module_1.main()时,我无法执行任何操作//打印任何内容…

  • 我已经为我的一个脚本创建了一个小GUI。一切进展顺利。 当我点击一个按钮时,它会启动一个大功能,解析一些网站的大量数据。 但一旦我点击了按钮,程序就会冻结,直到函数完全运行。一切正常,但为什么我的GUI在函数执行过程中会冻结。我想打印一个小进度条,但这是不可能的。 以下是该计划的一部分: 在执行模块_1期间,我无法执行/打印任何内容。main()。。。GUI完全冻结。 模块1。main()函数是一

  • 问题内容: 我应该如何从我的程序中运行另一个程序?我需要能够将数据写入启动的程序中(并可能从中读取) 我不确定这是否是标准的C函数。我需要应该在Linux下工作的解决方案。 问题答案: 您要使用。它为您提供了一个单向管道,您可以使用该管道访问程序的stdin和stdout。 popen是现代unix和类似unix的操作系统的标准配置,其中Linux是其中之一:-) 类型 在终端上阅读有关它的更多信

  • 问题内容: 我想在几种不同条件下在linux shell中执行某些操作,并能够输出每次执行的执行时间。 我知道我可以编写一个可以执行此操作的perl或python脚本,但是有什么方法可以在shell中执行它吗?(碰巧是bash) 问题答案: 使用内置关键字: 例:

  • 我已经在Eclipse中创建了用于执行Selenium测试的Maven项目。我编写了一个TestSuite作为testng.xml。我喜欢从pom.xml运行这个testng.xml。 当我运行pom.xml时(右键单击pom.xml->Maven test),构建是成功的,但没有运行任何测试。测试结果如下: 结果:运行的测试:0次,失败:0次,错误:0次,跳过:0次 我的testng.xml:

  • 我已经通过Spring Boot应用程序连接了MARIA DB(Mysql)(在src/main/resources/aplication.properties中给出了mariadb的详细信息) 我写了一些基本的测试。在test/resources/application.properties中-->给定H2数据库的详细信息。 如果我在运行test,它将正确地接受test/resources/ap