呵呵,我就一新手,代码是书上的。主要是实验组件上的鼠标事件。
当一个组件处于激活状态时,组件可以成为触发 KeyEvent 事件的事件源。组件可以触发焦点事件,从无输入焦点变为有输入焦点是,触发 FocusEvent 事件。使用FocusListener接口处理焦点事件。
Java Code
MainClass.javapublic class MainClass
{
public static void main(String args[])
{
new HuaRongRoad();
}
}HuaRongRoad.javaimport java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class HuaRongRoad extends JFrame
implements MouseListener,KeyListener,ActionListener
{
Person person[]=new Person[10];
JButton left,right,above,below;
JButton restart=new JButton("重新开始");
public HuaRongRoad() 
{
init();
setBounds(100,100,320,400);
setVisible(true);
validate();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void init()
{
setLayout(null);
add(restart);
restart.setBounds(100,320,120,25);
restart.addActionListener(this);
String name[]={"曹操","关羽","张","刘","周","黄","兵","兵","兵","兵"};
for (int k=0;k<name.length;k++)
{
person[k]=new Person(k,name[k]);
person[k].addMouseListener(this);
person[k].addKeyListener(this);
add(person[k]);
}
person[0].setBounds(104,54,100,100);
person[1].setBounds(104,154,100,50);
person[2].setBounds(54,154,50,100);
person[3].setBounds(204,154,50,100);
person[4].setBounds(54,54,50,100);
person[5].setBounds(204,54,50,100);
person[6].setBounds(54,254,50,50);
person[7].setBounds(204,254,50,50);
person[8].setBounds(104,204,50,50);
person[9].setBounds(154,204,50,50);
person[9].requestFocus();
left=new JButton(); right=new JButton();
above=new JButton(); below=new JButton();
add(left); add(right);
add(above); add(below);
left.setBounds(49,49,5,260);
right.setBounds(254,49,5,260);
above.setBounds(49,49,210,5);
below.setBounds(49,304,210,5);
validate();
}
public void keyTyped(KeyEvent e){}
public void keyReleased(KeyEvent e){}
public void keyPressed(KeyEvent e)
{
Person man=(Person)e.getSource();
if (e.getKeyCode()==KeyEvent.VK_DOWN)
{  go(man,below);
}
if (e.getKeyCode()==KeyEvent.VK_UP)
{  go(man,above);
}
if (e.getKeyCode()==KeyEvent.VK_LEFT)
{  go(man,left);
}
if (e.getKeyCode()==KeyEvent.VK_RIGHT)
{  go(man,right);
}
}
public void mousePressed(MouseEvent e)
{
Person man=(Person)e.getSource();
int x=-1,y=-1;
x=e.getX();
y=e.getY();
int w=man.getBounds().width;
int h=man.getBounds().height;
if (y>h/2)
{  go(man,below);
}
if (y<h/2)
{  go(man,above);
}
if (x>w/2)
{  go(man,left);
}
if (x<w/2)
{  go(man,right);
}
}
public void mouseReleased(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public void mouseClicked(MouseEvent e){}
public void go(Person man,JButton direction)
{
boolean move=true;
Rectangle manRect=man.getBounds();
int x=man.getBounds().x;
int y=man.getBounds().y;
if (direction==below)
    {  y=y+50;
    }
else if (direction==above)
    {  y=y-50;
}
else if (direction==left)
{  x=x-50;
}
else if (direction==right)
{  x=x+50;
}
manRect.setLocation(x,y);
Rectangle directionRect=direction.getBounds();
for (int k=0;k<10 ;k++ )
{
Rectangle personRect=person[k].getBounds();
if ((manRect.intersects(personRect))&(man.number!=k))
{  move=false;
}
}
if (manRect.intersects(directionRect))
{  move=false;
}
if (move==true)
{  man.setLocation(x,y);
}
}
public void actionPerformed(ActionEvent e)
{
dispose();
new HuaRongRoad();
}
}Person.javaimport java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Person extends JButton implements FocusListener
{
int number;
Color c=new Color(255,245,170);
Person(int number,String s)
{
super(s);
setBackground(c);
this.number=number;
c=getBackground();
setFont(new Font("楷体_BG2312",Font.BOLD,14));
addFocusListener(this);
}
public void focusGained(FocusEvent e)
{  setBackground(Color.red);
}
public void focusLost(FocusEvent e)
{  setBackground(c);
}
}

解决方案 »

  1.   

    做的不错不过这个例子可能是教你熟悉组件,所有格子都是JButton而在正式做游戏的时候
    很忌讳使用一个控件(例如JButton)来做一个游戏中的单元格的
    这往往需要自己用Graphics2D来在一个面板上画的
    这样可以节省资源,一个Swing组件,附带的属性和方法很多,创建一个蛮耗资源的
    一个简单的游戏看不出来
    如果一个复杂点的,比如围棋,你不能弄19*19个JButton吧
    所以,这个例子学习就好自己写游戏,一定要掌握Graphics2D的核心部分自己来画,不能全靠控件
      

  2.   

    莫非是 java2实用教程 里的例子?
      

  3.   

    自己写游戏,一定要掌握Graphics2D的核心部分自己来画,不能全靠控件       这句话不错......