您的位置: 网站首页 > 程序开发 > Java程序设计 > 第10章 图形用户界面 > 【10.6 上 机 实 验】

10.6 上 机 实 验

 

10.6 

编写一个程序,它在一个窗口描绘出一个小鸟的图标,然后用几个按钮控制这个图标上、下、左、右移动。

实现这一功能的类可以扩展JFrame类。按照一般习惯,把按钮放在窗口的最后一行。绘图用paint( )方法完成。为了移动图标,必须在不同的xy坐标上不断画出这个图标。程序实现时,xy坐标被定义为两个域,可使用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  移动的小鸟

 

程序开始执行时在初始位置绘出图标,但单击按钮时并不能移动图标,图标只是在改变窗口大小时发生变动。这是因为只有调用paint( )方法才能在新的位置重新绘制图标,而只有当构造一个新的JFrame或改变一个JFrame的大小时,paint( )方法才被自动调用,单击按钮却没有调用它。因此,要响应单击按钮事件,这里需要调用继承的repaint( )方法,调用语句增加在actionPerformed方法的最后一行。

现在单击任何一个按钮时,都会使图标移动,如图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( )方法。

如果不覆盖一个JFramepaint( )方法,则更为方便的办法是使用Canvas类,在这个类中包含特殊的绘图方法。