1

我开始学习Java。目前,我正试图让一个关键的听众工作,但我很挣扎。我的代码如下。匿名内部类开头的第一个大括号有错误。我可能缺少一些简单的东西,所以任何帮助都会很有用。

public class Klistener extends JFrame {

    void Klistener()
    {
        JPanel c = new JPanel();
        c.setFocusTraversalKeysEnabled(true);
        this.add(c);
        c.addKeyListener(new KeyListener()
        {


            @Override
          public void keyTyped(KeyEvent e)
          {
              if(e.getKeyCode()==KeyEvent.VK_DOWN)
              {
                  System.out.print("hi");
              }
          }

        });
    }

    public static void main(String[] args)
    {
        Klistener a = new Klistener();
        JFrame b = new JFrame("hi");
        b.setVisible(true);
        b.setSize(500, 500);


        b.setLocation(500, 200);
        b.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
4

4 回答 4

3

你忘了提供其他两种方法的实现KeyListener。如果您不想这样做,请扩展KeyAdapter而不是KeyListener. KeyAdapter提供所有KeyListener方法的空实现,因此您可以选择要实现的方法。

于 2012-09-04T00:02:51.677 回答
3

因为KeyListener是一个interface,你的内部类需要重写接口中声明的所有方法。该接口指定以下方法:

public interface KeyListener extends EventListener {

    /**
     * Invoked when a key has been typed.
     * See the class description for {@link KeyEvent} for a definition of 
     * a key typed event.
     */
    public void keyTyped(KeyEvent e);

    /**
     * Invoked when a key has been pressed. 
     * See the class description for {@link KeyEvent} for a definition of 
     * a key pressed event.
     */
    public void keyPressed(KeyEvent e);

    /**
     * Invoked when a key has been released.
     * See the class description for {@link KeyEvent} for a definition of 
     * a key released event.
     */
    public void keyReleased(KeyEvent e);
}

更好的方法是使用适配器类来接收键盘事件。在这里,您可以覆盖任何您想要的特定内容,而不是全部。KeyAdapter abstractmethod

此外,由于您是新手Java Swing,以下链接可能会派上用场:

哦,我注意到你void Klistener在类中有一个名为Klistener. 我假设您正在尝试制作一个constructor而不是一个方法本身。如果是这种情况,那就意识到constructors没有任何返回类型!这是另一个可能有帮助的链接。

于 2012-09-04T00:03:22.330 回答
2

你有很多错误,所以我什至不知道要开始:

1)KeyListener是一个接口,因此您必须实现所有方法。

2)不要添加KeyListener到面板,将其添加到您的JFrame. 您可以通过创建匿名类或这种方式来做到这一点

public class Klistener extends JFrame implements KeyListener{}

3)不要调用setSize()method,call pack()and setPreferredSize()method's and after that setVisible(true),并在代码末尾调用它们。

这是您的主要方法的外观:

  public static void main(String[] args){
    Klistener k = new Klistener();
    k.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    k.setLocationByPlatform(true);
    k.setPreferredSize(new Dimension(400,300));
    k.pack();
    k.setVisible(true);

  }
于 2012-09-04T00:15:06.513 回答
1

你那里有一些错误。这是一个工作代码(最小更改):

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class Klistener extends JFrame {
public Klistener()
{
    JPanel c = new JPanel();
    c.setFocusTraversalKeysEnabled(true);       
    addKeyListener(new KeyListener()
    {


        @Override
        public void keyTyped(KeyEvent e){}

        @Override
        public void keyPressed(KeyEvent e) {
            if(e.getKeyCode()==KeyEvent.VK_DOWN)                
                        System.out.println("hi");
        }

        @Override
        public void keyReleased(KeyEvent e){}

    });

}
public static void main(String[] args)
{
    Klistener a = new Klistener();
    a.setSize(500, 500);
    a.setLocation(500, 200);
    a.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    a.setVisible(true);

}
}
于 2012-09-04T00:22:02.703 回答