编写一个程序,它在一个窗口描绘出一个小鸟的图标,然后用几个按钮控制这个图标上、下、左、右移动。
实现这一功能的类可以扩展JFrame类。按照一般习惯,把按钮放在窗口的最后一行。绘图用paint( )方法完成。为了移动图标,必须在不同的x、y坐标上不断画出这个图标。程序实现时,x、y坐标被定义为两个域,可使用moveUp( )、moveDown( )、moveLeft( )以及moveRight( )等方法来改变这两个域,也就改变了图标的位置。当然,首先必须激活相应的按钮,并且在actionPerformed()方法中调用不同的移动方法,以下是程序代码。
/** MoveBird.java @author ZDS
* 2007-2-19 下午22:38:15 */
packagechap10;
importjava.awt.*;
importjava.awt.event.*;
importjava.net.URL;
importjavax.swing.JFrame;
/** 用按钮控制小鸟的移动*/
publicclass MoveBird extends JFrame implements ActionListener {
private final int WIDTH = 50, HEIGHT = 37, INC = 4;
private Button left = new Button("Left");
private Button right = new Button("Right");
private Button up = new Button("Up");
private Button down = new Button("Down");
private int x = 50, y = 50;
private Image bird;
//建立一个Image对象,供drawImage()方法调用
public MoveBird() {
super("Moving Bird");
setup();
left.addActionListener(this);
right.addActionListener(this);
up.addActionListener(this);
down.addActionListener(this);
URL url = getClass().getResource("/chap10/bird.gif");
bird = Toolkit.getDefaultToolkit().getImage(url);
}
private void setup() {
Panel buttons = new Panel();
buttons.setLayout(new FlowLayout());
buttons.add(up);
buttons.add(down);
buttons.add(left);
buttons.add(right);
setLayout(new BorderLayout());
add("South", buttons);
}
// 显示图标
public void paint(Graphics g) {
super.paint(g);
g.drawImage(bird, x, y, WIDTH, HEIGHT, this);
}
public void moveUp() {
y -= INC;
repaint();
}
public void moveDown() {
y += INC;
repaint();
}
public void moveLeft() {
x -= INC;
repaint();
}
public void moveRight() {
x += INC;
repaint();
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == up)
moveUp();
else if (e.getSource() == down)
moveDown();
else if (e.getSource() == left)
moveLeft();
else if (e.getSource() == right)
moveRight();
}
public static void main(String args[]) {
MoveBird mb = new MoveBird();
mb.setSize(400, 400);
mb.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mb.setVisible(true);
}
}
本程序在建立一个Image对象时,使用了Toolkit类的getDefaultToolkit( )方法和getImage( )方法,Toolkit类是AWT包中的一个抽象超类。Toolkit的子类用于将各种组件与本地工具包(Native Toolkit)的具体实现绑定在一起。getDefaultToolkit( )方法获取默认的Toolkit,然后用getImage( )方法将bird.jpg文件建立一个Image对象。
图10-14 移动的小鸟
|
现在单击任何一个按钮时,都会使图标移动,如图10-14所示。
当改变窗口时,paint( )方法会自动调用,而使用repaint( )方法也会强行调用paint( )方法。这实际牵涉到Component类包含的3个绘图方法及其调用关系,如下所示。
public void repaint( ) // 完成对update( )方法的调用。
public void update(Graphics g) // 清理绘图区域并调用paint( )方法。
public void paint(Graphics g) // 生成图形(Graphics)对象。
为了在各种情况下绘制图形,往往需要用各种代码来覆盖paint( )方法;如果需要更新图形,则要调用repaint( )方法。当窗口每次更新的时候,如窗口改变大小时,也自动调用repaint( )方法。通常不覆盖repaint( )方法,但可覆盖update( )方法来规定怎样清除绘图区,如定义背景颜色,同时在覆盖代码中必须包含paint( )方法。
如果不覆盖一个JFrame类paint( )方法,则更为方便的办法是使用Canvas类,在这个类中包含特殊的绘图方法。