【问题标题】:keyPressed and keyReleased don't workkeyPressed 和 keyReleased 不起作用
【发布时间】:2018-09-02 09:12:38
【问题描述】:

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

我想在按下某个键并单击“登录”按钮时弹出管理员登录(有没有更好的方法来做到这一点?),所以我让类实现 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

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

【问题讨论】:

  • 您对这个问题还有什么疑问吗?
  • 并非如此。我认为问题解决了,至少一切正常。谢谢。

标签: java macos swing keyboard


【解决方案1】:

问题是这样的:你的 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 不能被聚焦,它仍然会执行它的动作。因此,您的程序将正常运行!

【讨论】:

    猜你喜欢
    • 2018-06-24
    • 2012-12-11
    • 2014-03-05
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 2018-10-06
    相关资源
    最近更新 更多