键按下和键释放不起作用



我正在制作一个简单的电子队列,遇到了困难。

我想在按下某个键并单击"登录"按钮时弹出管理员登录(有更好的方法吗?(,所以我让类实现 KeyListener。但是keyPressed()keyTyped()keyReleased()从来没有被召唤过!

这是代码:

package net.koya.pleasewait;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class PleaseWait implements ActionListener, KeyListener {
    private boolean shiftDown = false;
    public static void main(String[] args)
    {
        PleaseWait pleaseWait = new PleaseWait();
        JFrame admin = new JFrame("Queue admin");
        JPanel loginPanel = new JPanel();
        JButton login = new JButton("Login");
        login.setAlignmentX(0.5f);
        login.addActionListener(pleaseWait);
        loginPanel.setLayout(new BoxLayout(loginPanel, BoxLayout.Y_AXIS));
        loginPanel.add(login);
        admin.addKeyListener(pleaseWait);
        admin.setContentPane(loginPanel);
        admin.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        admin.setBounds(0, 0, 200, 200);
        admin.setVisible(true);
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        if (shiftDown)
            JOptionPane.showMessageDialog(
                null, "Admin mode!", "Hello, World!", JOptionPane.WARNING_MESSAGE);
    }
    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_SHIFT) {
            System.out.println("Shift pressed");
            shiftDown = true;
        }
    }
    @Override
    public void keyReleased(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_SHIFT) {
            System.out.println("Shift released");
            shiftDown = false;
        }
    }
    @Override
    public void keyTyped(KeyEvent e) { }
}

顺便说一句,我在macOS 10.13.3上使用javaSE-1.8.0_101.

任何帮助将不胜感激,因为我以前从未遇到过这样的问题。

问题是这样的:你的 JButton login控制着你的 JPanel loginPanel的焦点。因此,即使您按下 JPanel 上的某个键,JButton 也会控制该命令,并且由于 JButton 没有 KeyListener,因此它什么也不做。

要解决此问题,只需添加如下login.setFocusable(false)

loginPanel.setLayout(new BoxLayout(loginPanel, BoxLayout.Y_AXIS));
loginPanel.add(login);
login.setFocusable(false);
loginPanel.addKeyListener(pleaseWait);
admin.addKeyListener(pleaseWait);
admin.setContentPane(loginPanel);
admin.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
admin.setBounds(0, 0, 200, 200);
admin.setVisible(true);

现在,JButton停止吸引KeyListener的注意力,JPanel能够识别按键。

即使 JButton 无法集中注意力,它仍然会执行其操作。因此,您的程序将正常工作!

最新更新