听CAPS键

时间:2017-02-27 20:22:42

标签: java swing

我一直在尝试构建一个小实用程序,用于在用户按下" Caps Lock"键。程序应该启动并首先显示键是ON还是OFF。程序还应该监听任何更改,并相应地更新框架。

不幸的是,我可以做到的唯一部分是在开始时,如果Caps键是打开还是关闭,则显示框架。在那之后,它会卡住。即使我按下键,屏幕也不会改变任何内容。

当大写键开启时,该程序也应该产生.beep()声音,但只有在我按下键的情况下启动它才有效。

代码:

public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.setSize(400, 400);
    JLabel label = new JLabel("CAPS LOCK IS ON!");
    JLabel label1 = new JLabel("CAPS LOCK IS OFF!");

    boolean check = Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_CAPS_LOCK);

    if (check == true) {
        frame.repaint();
        frame.add(label);
        Toolkit.getDefaultToolkit().beep();
    } else {
        frame.repaint();
        frame.add(label1);
    }
    keyPressed(KeyCode.CAPS);
    frame.show();

}

public static void keyPressed(KeyCode e) {
    boolean check = Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_CAPS_LOCK);
    if (check == true) {
        Toolkit.getDefaultToolkit().beep();
    }
}

编辑:如果您只想知道Caps键是否切换(打开):

if (Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_CAPS_LOCK)) {
                label.setText("CAPS LOCK IS ON!");
                Toolkit.getDefaultToolkit().beep();
            } else {
                label.setText("CAPS LOCK IS OFF");
            }

这种方式只有当盖帽键被切换时才会发出蜂鸣声,而在未切换时也不会发出蜂鸣声。

3 个答案:

答案 0 :(得分:2)

如果您只想在应用程序中跟踪“大写锁定”,您可以执行以下操作:

    KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher()
    {
        @Override
        public boolean dispatchKeyEvent(KeyEvent e)
        {
            if (KeyEvent.VK_CAPS_LOCK == e.getKeyCode())
            {
                boolean check = Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_CAPS_LOCK); 
                // do something here
            }
            return false;
        }
    });

当您的应用重新聚焦时,您可能还需要跟踪焦点并更新状态。

但是,如果您希望您的应用程序在系统范围内跟踪Caps Lock,我怀疑您这样做,不幸的是您运气不好。纯Java中没有办法做到这一点,因为这是一个非常特定于操作系统的功能。仍然对于Windows,有一个C代码https://github.com/kristian/system-hook

的包装器

答案 1 :(得分:1)

正如其他答案所述,您的代码未注册KeyListener,因此只需读取密钥的锁定状态一次。

要捕获 CapsLock 上的状态更改,您需要分别关注keyPressed(上限锁定)和keyReleased(上限锁定)。

看一下这个例子:

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

public class CapChecker {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.setSize(400, 400);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                JLabel label = new JLabel();
                frame.add(label);

                frame.addKeyListener(new KeyAdapter() {
                    @Override
                    public void keyPressed(KeyEvent e) {

                        if (e.getKeyCode() == KeyEvent.VK_CAPS_LOCK && Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_CAPS_LOCK)) {
                            label.setText("CAPS LOCK IS ON!");
                            Toolkit.getDefaultToolkit().beep();
                        } else {
                            label.setText("" + e.getKeyChar());
                        }
                    }

                    @Override
                    public void keyReleased(KeyEvent e) {
                        if (e.getKeyCode() == KeyEvent.VK_CAPS_LOCK) {
                            label.setText("CAPS LOCK IS OFF!");
                        }
                    }
                });
                frame.setVisible(true);
            }
        });
    }
}

答案 2 :(得分:0)

显示框架后,您的程序什么都不做。您必须将KeyListener注册到框架:

frame.addKeyListener(new KeyAdapter() {
    public void keyPressed(KeyEvent e) {}
    public void keyReleased(KeyEvent e) {}
})

在这些方法中,您可以对按键或释放进行反应。