无法在java中正确覆盖keyPressed(KeyEvent)

时间:2017-04-06 22:37:31

标签: java swing keylistener

我正在尝试创建一个keylistener,用于检测用户何时点击“enter”键,但每次编译时都会出现错误:

 NameBox.java:6: error: NameBox is not abstract and does not override 
 abstract method keyPressed(KeyEvent) in KeyListener
 public class NameBox extends JFrame implements KeyListener
        ^

在我下面提供的课程中,我确信我正确地实现了正确的关键听众,但显然我没有。如果有人能够解释为什么我仍然会收到这个错误,那就太棒了!

import java.util.*;
import java.io.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class NameBox extends JFrame implements KeyListener
{
    String userWord = "";
    JTextField userInput = new JTextField(20);
    JButton submit = new JButton("Submit");

    public NameBox()
    {
        super("Enter your name");
        JPanel centerPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 15, 15));
        setSize(400, 200);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        submit.addKeyListener(new KeyAdapter(){
            public void keyPressed(KeyEvent evt)
            {
                if(evt.getKeyCode() == KeyEvent.VK_ENTER)
                {
                    submitAction();
                }
            }
        });
        centerPanel.add(userInput);
        JPanel southPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 15, 15));
        southPanel.add(submit);
        Box theBox = Box.createVerticalBox();
        theBox.add(Box.createVerticalStrut(100));
        theBox.add(centerPanel);
        theBox.add(Box.createVerticalStrut(200));
        theBox.add(southPanel);
        add(theBox);

    }
    private void submitAction()
    {
        userWord = userInput.getText();
    }
    public static void main(String[] args)
    {
        new NameBox().setVisible(true);
    }
    @Override
    public void keyTyped(KeyEvent e){}
    @Override
    public void keyReleased(KeyEvent e){}

}

2 个答案:

答案 0 :(得分:1)

您包含keyTypedkeyReleased方法,但KeyListener界面要求您还包含keyPressed方法,即使它与其他方法一样空白。要解决此问题,您可以添加public void keyPressed(KeyEvent e){}

答案 1 :(得分:0)

考虑使用Lambda表达式,它非常简单,只需在您的情况下使用。

written
written
written

Lambda表达式可以完全摆脱内部的ActionListener类。 我不确定原因,但TextField的默认操作是监听"输入"键。

此外,如果你想保留你的ActionListener,你必须覆盖keylistener的其他方法,即使该动作有一个空的定义。

userInput.addActionListener(e -> submitAction());