java - 按下按钮后的 KeyListener

标签 java actionlistener keylistener

我正在创建一个小应用程序,如果按下大写锁定按钮,它将添加一个托盘图标。我收到一个似乎无法修复的错误。

这是我的代码

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {       

    public void keyPressed(KeyEvent ke){

        //removed for StackOverflow

    }

 }   

我在 keyPressed 监听器上收到“非法表达式开始”错误 现在这可能是一个 super 简单的修复,我只是不知道。

最佳答案

KeyListener 仅当其注册的组件可聚焦且具有焦点时才会被激活。如果 UI 有其他组件(如按钮或文本字段),那么它将无法工作。

我假设您想知道大写锁定状态何时发生变化,无论程序中的焦点是什么。为此,您可以使用 Toolkit 注册 AWTListener 并监视应用程序处理的所有关键流量。

使用此监听器,您可以监视 KeyEvent.VK_CAPS_LOCK 按键事件并采取适当的操作。

如果您需要知道大写锁定键的确切状态,可以使用Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_CAPS_LOCK)来确定它是打开还是关闭...

import java.awt.AWTEvent;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.Toolkit;
import java.awt.event.AWTEventListener;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestListener {

    public static void main(String[] args) {
        new TestListener();
    }

    public TestListener() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private JLabel capsStateLabel;

        public TestPane() {
            setLayout(new GridBagLayout());
            capsStateLabel = new JLabel();
            add(capsStateLabel);
            updateLabelState();
            Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {

                @Override
                public void eventDispatched(AWTEvent event) {
                    if (event instanceof KeyEvent) {

                        KeyEvent ke = (KeyEvent) event;
                        switch (ke.getKeyCode()) {
                            case KeyEvent.VK_CAPS_LOCK:
                                switch (ke.getID()) {
                                    case KeyEvent.KEY_PRESSED:
                                    case KeyEvent.KEY_RELEASED:
                                        updateLabelState();
                                        break;
                                }
                                break;
                        }

                    }
                }

            }, KeyEvent.KEY_EVENT_MASK);
        }

        protected void updateLabelState() {
            boolean capsState = Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_CAPS_LOCK);
            if (capsState) {
                capsStateLabel.setText("Caps is ON");
            } else {
                capsStateLabel.setText("Caps is OFF");
            }
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

    }

}

关于java - 按下按钮后的 KeyListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27026053/

相关文章:

java - 无法将数据从 asyncTask 传递到我的 Activity

java - 单击按钮时出现运行时错误,并且显示错误发生在 Action Listener 行中

java - 为什么我的射弹(图像对象)不移动? Java Swing

Java获取焦点

运行时的 Java 编译器

java - Java 中完美的 URL 验证正则表达式

java - 在 this.object 为 null 的 Java 中重写 equals 和 hashcode

java - 将变量传递到 Java ActionListener 中?

java |两个JButton中的ActionListener,没有响应

java - JTable 捕获关键事件?