snake是另一个类没有贴,在下面文件的Jpanel添加了键盘事件监听,还有个让蛇移动的线程,现在问题是蛇移动时间不开启的时候上下左右按键是有反应的,线程一开启再按键盘就没有反应了,但是里面有个“GO”按钮,作用是能改变蛇的方向,在蛇运动时候能够响应,请问这是怎么回事呢?package snakegame;import snakegame.Global;
import java.awt.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import java.awt.event.*;
import java.awt.color.*;class Game extends JFrame{
GamePanel panel = new GamePanel(); Game(){
super();
initComponent();
}
Game(String name){
super(name);
initComponent();
} private void initComponent(){ add(panel); setSize(Global.WIDTH,Global.HEIGHT);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
} public static void main(String[] args){
EventQueue.invokeLater(new Runnable(){
public void run(){
new Game("Game");
}
});
}
}class GamePanel extends JPanel{
final int SIZE = Global.SIZE;
int i = 0;
//Auto auto;
private Graphics gra;
Snake snake = new Snake();
JButton b1 = new JButton("前进"),
b2 = new JButton("GO!"); GamePanel(){
super();
init();
}
void init(){
this.setSize(Global.WIDTH,Global.HEIGHT);
add(b1);
add(b2);
b1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt) {
start();
}
});
b2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt) {
snake.setDirection(snake.DOWN);
}
});
this.setFocusable(true);//设置panel响应键盘监听
this.addKeyListener(new KeyListener(){
public void keyPressed(KeyEvent e){
switch(e.getKeyCode()){
case KeyEvent.VK_UP :
System.out.println("UP pressed");
snake.setDirection(snake.UP);
break;
case KeyEvent.VK_DOWN :
System.out.println("DOWN pressed");
snake.setDirection(snake.DOWN);
break;
case KeyEvent.VK_LEFT :
System.out.println("LEFT pressed");
snake.setDirection(snake.LEFT);
break;
case KeyEvent.VK_RIGHT :
System.out.println("RIGHT pressed");
snake.setDirection(snake.RIGHT);
break;
}
}
public void keyReleased(KeyEvent e){}
public void keyTyped(KeyEvent e){}
});
} void disPlay(){
repaint();
System.out.println("disPlay()");
}
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
snake.drawSnake(g);
g.setColor(Color.RED);
System.out.println("paintComponent()");
}
public void start(){
new Thread(new GameDriver()).start();
}
private class GameDriver implements Runnable{
@Override
public void run(){
while(true){
try {
snake.move();
disPlay();
Thread.sleep(500);
System.out.println("run()");
} catch (InterruptedException ex) {
Logger.getLogger(GamePanel.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
}
import java.awt.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import java.awt.event.*;
import java.awt.color.*;class Game extends JFrame{
GamePanel panel = new GamePanel(); Game(){
super();
initComponent();
}
Game(String name){
super(name);
initComponent();
} private void initComponent(){ add(panel); setSize(Global.WIDTH,Global.HEIGHT);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
} public static void main(String[] args){
EventQueue.invokeLater(new Runnable(){
public void run(){
new Game("Game");
}
});
}
}class GamePanel extends JPanel{
final int SIZE = Global.SIZE;
int i = 0;
//Auto auto;
private Graphics gra;
Snake snake = new Snake();
JButton b1 = new JButton("前进"),
b2 = new JButton("GO!"); GamePanel(){
super();
init();
}
void init(){
this.setSize(Global.WIDTH,Global.HEIGHT);
add(b1);
add(b2);
b1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt) {
start();
}
});
b2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt) {
snake.setDirection(snake.DOWN);
}
});
this.setFocusable(true);//设置panel响应键盘监听
this.addKeyListener(new KeyListener(){
public void keyPressed(KeyEvent e){
switch(e.getKeyCode()){
case KeyEvent.VK_UP :
System.out.println("UP pressed");
snake.setDirection(snake.UP);
break;
case KeyEvent.VK_DOWN :
System.out.println("DOWN pressed");
snake.setDirection(snake.DOWN);
break;
case KeyEvent.VK_LEFT :
System.out.println("LEFT pressed");
snake.setDirection(snake.LEFT);
break;
case KeyEvent.VK_RIGHT :
System.out.println("RIGHT pressed");
snake.setDirection(snake.RIGHT);
break;
}
}
public void keyReleased(KeyEvent e){}
public void keyTyped(KeyEvent e){}
});
} void disPlay(){
repaint();
System.out.println("disPlay()");
}
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
snake.drawSnake(g);
g.setColor(Color.RED);
System.out.println("paintComponent()");
}
public void start(){
new Thread(new GameDriver()).start();
}
private class GameDriver implements Runnable{
@Override
public void run(){
while(true){
try {
snake.move();
disPlay();
Thread.sleep(500);
System.out.println("run()");
} catch (InterruptedException ex) {
Logger.getLogger(GamePanel.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
}
还是感谢了。