//这个是我做的一个贪吃蛇 但是在处理键盘事件的时候却遇到了很大的麻烦
先做的时候我让TestSneak 直接继承了JFRame 但是键盘跟本就不起作用 然后
有改成现在这样 但是扩展性感觉特别差 谁有一个类似于键盘事件模型之类的
请指导一下 谢谢import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
public class TestSneak extends JPanel implements KeyListener,Runnable{
final int width=30;
final int height=20;
int x=0,y=0;
int a[][]=new int[21][31];
int direction=4;
final int up=1;
final int down=3;
final int left=2;
final int right=4;
final int length=8;//初始化长度
final int initx=8;
final int inity=5;
Node node;
Thread thread;
Food food=new Food();
LinkedList linklist;
SpecialThread st;
int count;
JLabel label;
boolean pause=true;
public TestSneak(){
this.setBackground(Color.black);
//this.setSize(400,320);
this.addKeyListener(this);
this.setLayout(new BorderLayout());
this.setOpaque(true);
}
public void init()
{
arrayIni();
direction=4;
count=0;
linklist=new LinkedList();
for(int i=10;i>=inity;i--)
{
node=new Node(initx,i);
a[initx][i]=1;
linklist.add(node);
}
for(int j=0;j<=30;j++){
a[0][j]=3;
a[20][j]=3;
}
for(int i=0;i<=20;i++){
a[i][0]=3;
a[i][30]=3;
}
this.creatFood();
}
public void arrayIni()
{
for(int i=0;i<20;i++)
{
for(int j=0;j<30;j++)
{
a[i][j]=0;
}
}
}
public void creatFood()
{
do
food.creatFood();
while(a[food.randomx][food.randomy]==1||a[food.randomx][food.randomy]==3);
a[food.randomx][food.randomy]=2;
count++;
///label.setText(String.valueOf(count));
}
public void changeDirection(int i)
{
if((i%2)!=(direction%2))
{
direction=i;
}
}
public boolean go()
{
Node node1=(Node)linklist.getFirst();
x=node1.x;
y=node1.y;
switch(direction)
{
case up:
//x=node1.x;
x--;break;
case down:
//x=node1.x;
x++;break;
case right:
//y=node1.y;
y++;break;
case left:
//y=node1.y;
y--;break;
}
if((x>=20)||(y>=30)||(x<0)||(y<0)||(a[x][y]==1)||(a[x][y]==3))
{
//System.out.println(x+" "+y);
JOptionPane.showMessageDialog(null,"a 啊 不行了 ");
init();
return false;
}
else
{
if(a[x][y]==2)
{
linklist.addFirst(new Node(x,y));
a[x][y]=1;
creatFood();
}
else if(a[x][y]==0)
{
// System.out.println("asdf");
linklist.addFirst(new Node(x,y));
a[x][y]=1;
Node node=(Node)linklist.removeLast();
a[node.x][node.y]=0;
//System.out.println(node.x+"ok"+node.y+" "+a[node.x][node.y]);
}
repaint();
return true;
}
}
public void keyPressed(KeyEvent e)
{
//System.out.println("change");
if(e.getKeyCode()==KeyEvent.VK_UP)
{
changeDirection(up);
}
if(e.getKeyCode()==KeyEvent.VK_DOWN)
{
changeDirection(down);
}
if(e.getKeyCode()==KeyEvent.VK_LEFT)
{
changeDirection(left);
}
if(e.getKeyCode()==KeyEvent.VK_RIGHT)
{
changeDirection(right);
}
}
public void keyReleased(KeyEvent e){}
public void keyTyped(KeyEvent e){}
public void run()
{
init();
while(true)
{
try
{
if(pause)
{
Thread.sleep(100);
go();
//System.out.println("is go");
}
}catch(Exception e){System.out.println(e.getMessage());}
}
}
public void creatSpecial()
{
}
public void paint(Graphics g)
{
// g.setColor(Color.white);
// g.fillRect(0,0,150,100);
// System.out.println(direction);
super.paint(g);
g.setColor(Color.BLUE);
g.drawRect(0,0,300,200);
for(int i=0;i<=20;i++)
{
for(int j=0;j<=30;j++)
{
if(a[i][j]==1)
{
g.setColor(Color.red);
g.fillRect(10*j,10*i,9,9);
}
if(a[i][j]==2)
{
g.setColor(Color.yellow);
g.fillOval(10*j,10*i,10,10);
}
if(a[i][j]==3)
{
g.setColor(Color.magenta);
g.fillRect(10*j,10*i,9,9);
}
if(a[i][j]==4)
{
g.setColor(Color.green);
g.fillRect(10*j,10*i,9,9);
}
}
}
}
public static void main(String[] arg){
TestSneak sm=new TestSneak();
JFrame frame=new JFrame();
frame.add(sm,"Center");
frame.setUndecorated(true);
frame.setBounds(300,300,310,210);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
sm.setFocusable(true);
try
{
Thread thread =new Thread(sm);
thread.start();
}catch(Exception e){}
}
}
先做的时候我让TestSneak 直接继承了JFRame 但是键盘跟本就不起作用 然后
有改成现在这样 但是扩展性感觉特别差 谁有一个类似于键盘事件模型之类的
请指导一下 谢谢import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
public class TestSneak extends JPanel implements KeyListener,Runnable{
final int width=30;
final int height=20;
int x=0,y=0;
int a[][]=new int[21][31];
int direction=4;
final int up=1;
final int down=3;
final int left=2;
final int right=4;
final int length=8;//初始化长度
final int initx=8;
final int inity=5;
Node node;
Thread thread;
Food food=new Food();
LinkedList linklist;
SpecialThread st;
int count;
JLabel label;
boolean pause=true;
public TestSneak(){
this.setBackground(Color.black);
//this.setSize(400,320);
this.addKeyListener(this);
this.setLayout(new BorderLayout());
this.setOpaque(true);
}
public void init()
{
arrayIni();
direction=4;
count=0;
linklist=new LinkedList();
for(int i=10;i>=inity;i--)
{
node=new Node(initx,i);
a[initx][i]=1;
linklist.add(node);
}
for(int j=0;j<=30;j++){
a[0][j]=3;
a[20][j]=3;
}
for(int i=0;i<=20;i++){
a[i][0]=3;
a[i][30]=3;
}
this.creatFood();
}
public void arrayIni()
{
for(int i=0;i<20;i++)
{
for(int j=0;j<30;j++)
{
a[i][j]=0;
}
}
}
public void creatFood()
{
do
food.creatFood();
while(a[food.randomx][food.randomy]==1||a[food.randomx][food.randomy]==3);
a[food.randomx][food.randomy]=2;
count++;
///label.setText(String.valueOf(count));
}
public void changeDirection(int i)
{
if((i%2)!=(direction%2))
{
direction=i;
}
}
public boolean go()
{
Node node1=(Node)linklist.getFirst();
x=node1.x;
y=node1.y;
switch(direction)
{
case up:
//x=node1.x;
x--;break;
case down:
//x=node1.x;
x++;break;
case right:
//y=node1.y;
y++;break;
case left:
//y=node1.y;
y--;break;
}
if((x>=20)||(y>=30)||(x<0)||(y<0)||(a[x][y]==1)||(a[x][y]==3))
{
//System.out.println(x+" "+y);
JOptionPane.showMessageDialog(null,"a 啊 不行了 ");
init();
return false;
}
else
{
if(a[x][y]==2)
{
linklist.addFirst(new Node(x,y));
a[x][y]=1;
creatFood();
}
else if(a[x][y]==0)
{
// System.out.println("asdf");
linklist.addFirst(new Node(x,y));
a[x][y]=1;
Node node=(Node)linklist.removeLast();
a[node.x][node.y]=0;
//System.out.println(node.x+"ok"+node.y+" "+a[node.x][node.y]);
}
repaint();
return true;
}
}
public void keyPressed(KeyEvent e)
{
//System.out.println("change");
if(e.getKeyCode()==KeyEvent.VK_UP)
{
changeDirection(up);
}
if(e.getKeyCode()==KeyEvent.VK_DOWN)
{
changeDirection(down);
}
if(e.getKeyCode()==KeyEvent.VK_LEFT)
{
changeDirection(left);
}
if(e.getKeyCode()==KeyEvent.VK_RIGHT)
{
changeDirection(right);
}
}
public void keyReleased(KeyEvent e){}
public void keyTyped(KeyEvent e){}
public void run()
{
init();
while(true)
{
try
{
if(pause)
{
Thread.sleep(100);
go();
//System.out.println("is go");
}
}catch(Exception e){System.out.println(e.getMessage());}
}
}
public void creatSpecial()
{
}
public void paint(Graphics g)
{
// g.setColor(Color.white);
// g.fillRect(0,0,150,100);
// System.out.println(direction);
super.paint(g);
g.setColor(Color.BLUE);
g.drawRect(0,0,300,200);
for(int i=0;i<=20;i++)
{
for(int j=0;j<=30;j++)
{
if(a[i][j]==1)
{
g.setColor(Color.red);
g.fillRect(10*j,10*i,9,9);
}
if(a[i][j]==2)
{
g.setColor(Color.yellow);
g.fillOval(10*j,10*i,10,10);
}
if(a[i][j]==3)
{
g.setColor(Color.magenta);
g.fillRect(10*j,10*i,9,9);
}
if(a[i][j]==4)
{
g.setColor(Color.green);
g.fillRect(10*j,10*i,9,9);
}
}
}
}
public static void main(String[] arg){
TestSneak sm=new TestSneak();
JFrame frame=new JFrame();
frame.add(sm,"Center");
frame.setUndecorated(true);
frame.setBounds(300,300,310,210);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
sm.setFocusable(true);
try
{
Thread thread =new Thread(sm);
thread.start();
}catch(Exception e){}
}
}
解决方案 »
- JPanel类里的组件如何随窗口一起改变大小
- 简单问题,java文件读入的时候,如何动态分配缓存大小?100分
- JFrame只能加一个JLabel吗?
- 二维数组
- 急!!!SWT 上绘制棋盘和棋子!
- 讨论:在JDK1.5,StringBuffer比String有多大优势?,String 与 StringBuffer类
- 为什么用while(true)语句? 急,急,急!
- Integer.ValueOf().intValue和Integer.parseInt有什么区别?
- 请问java中匿名函数的作用
- Java给我的麻烦!(有分!!)
- 菜鸟劳驾大虾一举手之功--经典的数三退一问题源程
- GUI实际开发问题??
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;public class TestJPanel implements java.awt.event.ActionListener{
private JPanel panel;
private Point last;
private java.util.Vector lines;
private static final int SMALL_INCREMENT=4;
private static final int LARGE_INCREMENT=8;
int d=SMALL_INCREMENT;
public TestJPanel() {
last=new Point(100,100);
lines=new java.util.Vector();
JFrame frame=new JFrame();
panel=new JPanel(){
public void paintComponent(Graphics g){
super.paintComponentPresent;
Point pointStart,pointEnd;
g.setColor(java.awt.Color.red);
for(int i=0;i<lines.size()-1;i++){
pointStart=(Point)lines.elementAtLight Bulb;
pointEnd=(Point)lines.elementAt(i+1);
g.drawLine(pointStart.x,pointStart.y,pointEnd.x,pointEnd.y);
}
}
};
panel.setLayout(null);
javax.swing.JButton button=new javax.swing.JButton();
button.setBounds(10,10,100,30);
panel.add(button);//添加按钮
frame.getContentPane().add(panel,java.awt.BorderLayout.CENTER);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);KeyStroke shiftup = KeyStroke.getKeyStroke(KeyEvent.VK_UP,java.awt.event.InputEvent.SHIFT_DOWN_MASK);
panel.registerKeyboardAction(this,"shiftup",shiftup,JComponent.WHEN_FOCUSED);
KeyStroke shiftdown = KeyStroke.getKeyStroke(KeyEvent.VK_DOWN,java.awt.event.InputEvent.SHIFT_MASK);
panel.registerKeyboardAction(this,"shiftdown",shiftdown,JComponent.WHEN_FOCUSED);KeyStroke up = KeyStroke.getKeyStroke(KeyEvent.VK_UP,0);
panel.registerKeyboardAction(this,"up",up,JComponent.WHEN_FOCUSED);
KeyStroke down = KeyStroke.getKeyStroke(KeyEvent.VK_DOWN,0);
panel.registerKeyboardAction(this,"down",down,JComponent.WHEN_FOCUSED);
KeyStroke left = KeyStroke.getKeyStroke(KeyEvent.VK_LEFT,0);
panel.registerKeyboardAction(this,"left",left,JComponent.WHEN_FOCUSED);
KeyStroke right = KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT,0);
panel.registerKeyboardAction(this,"right",right,JComponent.WHEN_FOCUSED);
frame.setBounds(30,30,300,300);
frame.setVisible(true);
}
public void add(int dx, int dy) {
Point end=new Point(last.x+dx,last.y+dy);
lines.add(end);
panel.repaint();
last=end;
}
public static void main (String args[]) {
new TestJPanel();
}
public void actionPerformed(java.awt.event.ActionEvent actionEvent) {
String actionName=actionEvent.getActionCommand();
System.out.println("actionName="+actionName);
if(actionName.equalsIgnoreCase("shiftup")){
d=SMALL_INCREMENT;
}
if(actionName.equalsIgnoreCase("shiftdown")){
d=LARGE_INCREMENT;
}
if(actionName.equalsIgnoreCase("up")){
add(0,-d);
}
if(actionName.equalsIgnoreCase("down")){
add(0,d);
}
if(actionName.equalsIgnoreCase("left")){
add(-d,0);
}
if(actionName.equalsIgnoreCase("right")){
add(d,0);
}
}
}