Java Swing中的关键动作监听器

时间:2017-04-17 11:51:27

标签: java swing

我正在制作诺基亚蛇游戏。我已经制作了Frame和所有东西,并且已经写好了我的算法。目前我正在做一些事情,以便我可以使用我的键(例如左,右,上,下)执行操作。

我创建了一个名为Frame的类,它扩展了JFrame并实现了动作侦听器,我在Stack Overflow上看到的,我需要在密钥释放函数中编写代码,以便在按下键时运行代码。

但是当我按下键时没有发生任何事情。

这是我的Java代码:

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane; 

public class Frame extends JFrame implements KeyListener {

private static final int BOARD_SIZE = 51;
private static final int FRAME_SIZE = 700;
private static final Color SNAKE = Color.GREEN;
private static final Color BOARD = Color.WHITE;
private static final Color FOOD = Color.BLUE;

private static enum DIRECTION {
    right, left, up, down;
}

private static DIRECTION curr = DIRECTION.right;

public Frame() {
    super.setTitle("<<SNAKE GAME>>");
    super.setSize(this.FRAME_SIZE, this.FRAME_SIZE);
    GridLayout layout = new GridLayout(this.BOARD_SIZE, this.BOARD_SIZE);
    super.setLayout(layout);
    int val = this.randomNum(this.BOARD_SIZE * this.BOARD_SIZE - 7);
    int count = 0;
    for (int i = 0; i < this.BOARD_SIZE; i++) {
        for (int j = 0; j < this.BOARD_SIZE; j++) {
            JButton btn = new JButton();
            super.add(btn);
            this.buttons[i][j] = btn;
            if (i == this.BOARD_SIZE / 2 + 1 && j > this.BOARD_SIZE / 2 - 5 
                 && j <= this.BOARD_SIZE / 2 + 6) {
                this.snakeLL.snake.AddFirst(btn);
                btn.setBackground(this.SNAKE);
            } else if (count == val) {
                btn.setBackground(FOOD);
                count++;
            } else {
                btn.setBackground(this.BOARD);
                count++;
            }
        }
    }
    super.addKeyListener(this);
    super.setResizable(false);
    super.setVisible(true);
}

@Override
public void keyTyped(KeyEvent e) {
}

@Override
public void keyPressed(KeyEvent e) {
}

@Override
public void keyReleased(KeyEvent e) {
    int key = e.getKeyLocation();
    if (key == KeyEvent.VK_UP) {
        this.curr = DIRECTION.up;
    }
}

1 个答案:

答案 0 :(得分:2)

  

,我在堆栈溢出时看到的某个地方,我需要在密钥释放函数中编写我的代码,以便...在按下密钥时运行我的代码...

我认为你在这里没有这个建议。

我们始终建议您使用Key Bindings。阅读How to Use Key Bindings上Swing教程中的部分以获取基本信息。

您还可以查看Motion Using the Keyboard,其中包含使用Key Bindings为组件设置动画的工作示例。