【问题标题】:Java - Caps Lock status on form focus gainedJava - 获得表单焦点上的 Caps Lock 状态
【发布时间】:2015-03-14 17:39:13
【问题描述】:

好吧,我有以下代码来检查大写锁定的状态,当我在表单中使用 focu 更改大写锁定的状态时没有问题,但是当我最小化表单并更改大写锁定的状态时返回最大化表格不更新大写锁定的状态。有什么想法吗?

/**
 *
 * @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;         
}

【问题讨论】:

  • 杀死KeyListener,改为探测Toolkit#getLockingKeyState
  • 作为记录,Toolkit#getLockingKeyState 不会解决这个问题,因为它只会在 Java 窗口处于活动状态并具有焦点时更新。 (烦人,但出于安全原因这样做。)使用 Toolkit API 仍然比 KeyListener 方法更好,但不足以解决这个特定问题。
  • 类似问题..如果有人有解决方案...请帮助stackoverflow.com/questions/61359316/…

标签: java focus frame


【解决方案1】:

我找到了一个解决方案,虽然不是很专业,但很有效。我所做的是添加一个机器人以在表单成为焦点时按下时间大写锁定。两次回到用户上次离开的原始状态,显然它完美地更新了事件。

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();

    }
}
);

【讨论】:

  • 这太恶心了……解决了问题! AWT Toolkit 不允许检测在活动 AWT 窗口之外发生的状态更新,因此强制进行这样的更新是我们目前可用的唯一可移植解决方案。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多