Java-获得表单焦点上的大写锁定状态
好的,我有下面的代码来检查caps lock的状态,当我在表单中使用focu更改caps lock的状态时没有问题,但是当我最小化表单并更改caps lock的状态并返回以最大化表单时,不会更新caps lock的状态。有什么想法吗Java-获得表单焦点上的大写锁定状态,java,focus,frame,Java,Focus,Frame,好的,我有下面的代码来检查caps lock的状态,当我在表单中使用focu更改caps lock的状态时没有问题,但是当我最小化表单并更改caps lock的状态并返回以最大化表单时,不会更新caps lock的状态。有什么想法吗 /** * * @author joepa37 */ public class FocusExample extends javax.swing.JFrame { public FocusExample() { initCompone
/**
*
* @author joepa37
*/
public class FocusExample extends javax.swing.JFrame {
public FocusExample() {
initComponents();
}
@SuppressWarnings("unchecked")
private void initComponents() {
capsLockLbl = new javax.swing.JLabel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
addFocusListener(new java.awt.event.FocusAdapter() {
public void focusGained(java.awt.event.FocusEvent evt) {
formFocusGained(evt);
}
});
addKeyListener(new java.awt.event.KeyAdapter() {
public void keyPressed(java.awt.event.KeyEvent evt) {
formKeyPressed(evt);
}
});
getContentPane().setLayout(new java.awt.GridLayout());
capsLockLbl.setText("CAPS LOCK : ");
getContentPane().add(capsLockLbl);
pack();
}
private void formKeyPressed(java.awt.event.KeyEvent evt) {
if (evt.getKeyCode() == java.awt.event.KeyEvent.VK_CAPS_LOCK) {
updateStatus();
}
}
private void formFocusGained(java.awt.event.FocusEvent evt) {
updateStatus();
}
private void updateStatus(){
boolean isCapsLockOn = java.awt.Toolkit.getDefaultToolkit ().getLockingKeyState ( java.awt.event.KeyEvent.VK_CAPS_LOCK );
capsLockLbl.setText(isCapsLockOn ? "CAPS LOCK ON" : "CAPS LOCK OFF");
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new FocusExample().setVisible(true);
}
});
}
private javax.swing.JLabel capsLockLbl;
}
我找到了一个解决方案,虽然不是很专业,但它很有效。我所做的是添加一个机器人,在窗体聚焦时按下时间上限锁定。两次返回到用户上次离开的原始状态,显然它完美地更新了事件
this.addWindowListener(new WindowAdapter() {
@Override
public void windowActivated(WindowEvent we) {
try {
java.awt.Robot r = new java.awt.Robot();
//first time to update the event
r.keyPress(KeyEvent.VK_CAPS_LOCK);
r.keyRelease(KeyEvent.VK_CAPS_LOCK);
//second time to return to the last time status
r.keyPress(KeyEvent.VK_CAPS_LOCK);
r.keyRelease(KeyEvent.VK_CAPS_LOCK);
} catch (Exception e) {}
updateStatus();
}
}
);
杀死
键侦听器
,改为探测!请注意,Toolkit#getLockingKeyState
无法解决此问题,因为它仅在Java窗口处于活动状态且具有焦点时更新。(恼人,但出于安全原因)使用Toolkit API仍然优于KeyListener
方法,但不足以解决此特定问题。类似问题。。如果有人有解决办法。。。请帮帮我这太恶心了。。。解决了这个问题!AWT工具包不允许检测在活动AWT窗口之外发生的状态更新,因此强制这样的更新是我们目前唯一可用的可移植解决方案。谢谢