用于不扩展jpanel或类的类的Java KeyListener

时间:2014-09-03 11:30:09

标签: java swing jpanel keylistener

我试图在一个名为Player的新数据类型中创建一个KeyListener,它实现了KeyListner。如何在不实现或扩展任何内容的情况下使Player成为自己的KeyListener(即this.addKeyListner(this))?如果这不可能,我希望Player扩展/实现什么来避免类中无关的方法?

编辑:为了澄清,我没有询问如何在没有keyReleased,keyPressed和keyTyped方法的情况下实现KeyListener。我问如何让Player将自己添加为KeyListener,而不是像JPanel那样。

2 个答案:

答案 0 :(得分:1)

如果实现KeyListener(假设没有Abstract的实例),则必须实现3种方法。它们对于界面来说并不是无关紧要的,因为这些是密钥可能发生的三件事,它们可能并不全都与您相关,但它们只需要几行代码来实现它们。

void keyPressed(KeyEvent e)

按下某个键时调用。

void keyReleased(KeyEvent e)

释放密钥时调用。

void keyTyped(KeyEvent e)

键入密钥时调用。

只有3,这就是接口的本质。

答案 1 :(得分:0)

步骤:

  • 创建一个扩展JPanel的类,比如说MyJPanel。
  • JPanel类应该提供修改它的属性的方法。
  • 创建一个实现KeyListener的单独类,比如Player。
  • 将Player的对象添加到JPanel类。
  • 在关键事件上从Player类调用JPanel方法,然后重新绘制。

代码:

Panel类:

public class MyJPanel extends JPanel {

    private int x = 0;
    private int y = 0;

    public MyJPanel() {
        addKeyListener(new Player(this));
        setFocusable(true);
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.GREEN);
        g.fillRect(x, y, 100, 100);
    }

    public static void main(String[] args) {
        MyJPanel player = new MyJPanel();
        player.setSize(200, 200);
        JFrame frame = new JFrame();
        frame.add(player);
        frame.setLayout(null);
        frame.setTitle("Key listener example");
        frame.setSize(500, 500);
        frame.setVisible(true);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

    void incrementX() {
        x++;
        if (x > 500)
            x = 500;
    }

    void decrementX() {
        x--;
        if (x < 0)
            x = 0;
    }

    void incrementY() {
        y++;
        if (y > 500)
            y = 500;
    }

    void decrementY() {
        y--;
        if (y < 0)
            y = 0;
    }
}

实现KeyListener

的Player类
public class Player implements KeyListener {
    MyJPanel panel;

    public Player(MyJPanel myJPanel) {
        this.panel = myJPanel;
    }

    @Override
    public void keyPressed(KeyEvent pKeyEvent) {
        int key = pKeyEvent.getKeyCode();
        if (key == KeyEvent.VK_LEFT) {
            panel.decrementX();
        } else if (key == KeyEvent.VK_RIGHT) {
            panel.incrementX();
        } else if (key == KeyEvent.VK_UP) {
            panel.decrementY();
        } else if (key == KeyEvent.VK_DOWN) {
            panel.incrementY();

        }
        panel.repaint();
    }

    @Override
    public void keyReleased(KeyEvent pKeyEvent) {
    }

    @Override
    public void keyTyped(KeyEvent pKeyEvent) {
    }
}