java - 单击按钮后 KeyListener 不起作用

标签 java swing jbutton actionlistener keylistener

这是我的完整代码。它将帮助您理解。

我尝试在单击按钮或按下键盘时更改状态。当我按 ENTER 时,它会将 START 更改为 STOP(或 STOP 更改为 START)。当我单击“开始”按钮时,状态更改为开始。当我单击“停止”按钮时,状态更改为“停止”。我添加 System.out.println() 来检查我的代码是否正常工作。

第一次它工作正常。我可以通过按键盘(ENTER)更改状态(我可以看到“立即开始”或“立即停止”)

但是点击按钮后KeyListener(ENTER)不起作用。

我不知道为什么......请帮助我。

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ServerClass3 extends JFrame
{
    String SS = "Now Stop";

    public ServerClass3()
    {
        JButton btn_start = new JButton("Start");
        JButton btn_stop = new JButton("Stop");
        JButton btn_quit = new JButton("quit");

        btn_start.setLocation(20, 20);
        btn_start.setSize(100, 40);
        btn_stop.setLocation(140, 20);
        btn_stop.setSize(100, 40);
        btn_quit.setLocation(260, 20);
        btn_quit.setSize(100, 40);

        btn_start.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                SS = "Now Start";
                System.out.println("ss is " + SS);
            }
        });
        btn_stop.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                SS = "Now Stop";
                System.out.println("ss is " + SS);
            }
        });
        btn_quit.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                SS = "quit";
                System.out.println("ss is " + SS);
            }
        });
        KeyPanel p = new KeyPanel();
        setContentPane(p);

        p.add(btn_start);
        p.add(btn_stop);
        p.add(btn_quit);

        setSize(300, 300);
        setVisible(true);
        p.requestFocus();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    class KeyPanel extends JPanel
    {
        public KeyPanel()
        {
            this.addKeyListener(new KeyAdapter()
            {
                public void keyPressed(KeyEvent e)
                {
                    if (e.getKeyCode() == KeyEvent.VK_ENTER)
                    {
                        if (SS.equals("Now Stop"))
                        {
                            SS = "Now Start";
                            System.out.println(SS);
                        }
                        else
                        {
                            SS = "Now Stop";
                            System.out.println(SS);
                        }
                    }
                }
            });
        }
    }

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

最佳答案

发生这种情况是因为按下其中一个按钮后,焦点位于按钮上。因此,按钮会吸收所有事件,并且不会传递到您的 KeyPanel。您知道这是真的,因为当启动程序并按空格键时,没有任何反应。但是只要你按下一个按钮,当按下空格键时,它就会执行该按钮的actionPerformed事件。

要解决此问题,请使用 setFocusable 函数将所有按钮设置为不可聚焦:

button.setFocusable(false);

这样,无论您在窗口上单击什么内容或在何处单击,按钮都永远不会获得焦点,并且所有事件都会由 KeyPanel 注册。

关于java - 单击按钮后 KeyListener 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54398124/

相关文章:

java - 为什么从最大到最小 float 相加不如从最小到最大相加准确?

java - JPopupMenu 去除背景和边框

java - 我怎样才能修复一个 Java-GUI 程序(swing),它可以与 awesome-wm 一起工作?

java - Swing JList 和 DefaultListModel。

Java:按钮数组 - 获取源代码

java - WebDriverException : unknown error: document. getBoxObjectFor 不是通过 Java 使用 Selenium 与 ChromeDriver 和 Chrome 的函数

java - 如何修复 Intellij 中未设置的 TERM 环境?

java - Android,从SDK读取电子邮件

java - 向 JTextArea 添加水印

java - 无需单击即可切换 JToggleButton,并取消设置样式