我一直在尝试构建一个小实用程序,用于在用户按下" 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");
}
这种方式只有当盖帽键被切换时才会发出蜂鸣声,而在未切换时也不会发出蜂鸣声。
答案 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) {}
})
在这些方法中,您可以对按键或释放进行反应。