GUI制作使用鼠标事件移动的图像阵列

时间:2014-09-25 22:40:45

标签: java arrays object user-interface jpanel

此刻,我很不知所措。我只用了3个星期进行Java编程,我得到了这个代码并被告知要以我不熟悉的方式对其进行修改。所以任何帮助将不胜感激。我真的很想理解这一点,所以任何信息都会有所帮助。

目前我正在努力的方向是:

  

“修改Model类以存储Turtles的ArrayList。制作   Model.update为ArrayList中的每个Turtle调用Turtle.update。至   测试它,在ArrayList中放入两个或三个海龟,每个海龟都从中开始   不同的地点。单击时(导致“setDestination”)   被称为),使所有的海龟前往同一目的地。得到   在你继续之前,这很有用。“

在我创建这些海龟的阵列之前,一只乌龟显得很好。现在我已经创建了一个数组,我的面板上没有显示任何内容。但它确实可以正确编译。我知道我应该制作单独的Graphics对象,但是如何以及在哪里最好的地方呢?这是代码(在4个单独的文件中):

Controller.java

import java.awt.Graphics;
import java.io.IOException;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import javax.swing.Timer;

class Controller implements MouseListener
{
    Model model;
    View view;

    Controller() throws IOException, Exception {
        model = new Model();
        view = new View(this);
        new Timer(50, view).start();
    }

    public void update(Graphics g) {
        model.update(g);
    }

    public void mousePressed(MouseEvent e) {
        model.setDestination(e.getX(), e.getY(), view.getWidth(), view.getHeight());
    }

    public void mouseReleased(MouseEvent e) {    }
    public void mouseEntered(MouseEvent e) {    }
    public void mouseExited(MouseEvent e) {    }
    public void mouseClicked(MouseEvent e) {    }

    public static void main(String[] args) throws Exception {
        //  Use the following line to determine which directory your program
        //  is being executed from, since that is where the image files will
        //  need to be.
        //System.out.println("cwd=" + System.getProperty("user.dir"));
        new Controller();
    }
}

Model.java

import java.awt.Graphics;
import java.io.IOException;

class Model
{
    private Turtle[] t;

    Model() throws IOException {
        Turtle[] t = new  Turtle[3];    
            for (int i = 0; i <3; i++)
             t[i] = new Turtle();

       // turtle = new Turtle();
    }

    public void update(Graphics g) {         
        for(int i = 0; i <3; i++)
            t[i].update(g);             
    }

    public void setDestination(int x, int y, int width, int height) {
        for(int i = 0; i <3; i++)
        { 
            t[i].setDest(x, y);
        }    
    }    
}

Turtle.java

import java.awt.Graphics;
import java.awt.Image;
import javax.imageio.ImageIO;
import java.io.File;
import java.io.IOException;
import java.util.Random;

class Turtle
{
    private int x;
    private int y;
    private int dest_x;
    private int dest_y;
    private Image image;

    Turtle() {
        try {
            image = ImageIO.read(new File("turtle.png"));
        } catch (IOException ioe) {
            System.out.println("Unable to load image file.");                
        }            
    }

    public int getX() { return x; }
    public int getY() { return y; }

    public void setX(int xIn) { x = xIn; }
    public void setY(int yIn) { y = yIn; }

    public void update(Graphics g) {
        // Move the turtle
        if (x < dest_x) {
            x += 1;
        } else if (x > dest_x) {
            x -= 1;
        }

        if (y < dest_y) {
            y += 1;
        } else if (y > dest_y) {
            y -= 1;
        }

        // Draw the turtle                     
    }

    public void setDest(int x, int y) {
        dest_x = x;
        dest_y = y;
    }
}

View.java

import javax.swing.JFrame;
import java.awt.Graphics;
import javax.swing.JPanel;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class View extends JFrame implements ActionListener {

    private class MyPanel extends JPanel {
        Controller controller;

        MyPanel(Controller c) {
            controller = c;
            addMouseListener(c);
        }

        public void paintComponent(Graphics g) {
            controller.update(g);
            revalidate();
        }
    }


    public View(Controller c) throws Exception{
        setTitle("Assignment 4");
        setSize(1000, 700);
        getContentPane().add(new MyPanel(c));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public void actionPerformed(ActionEvent evt) {
        repaint();
    }
}

2 个答案:

答案 0 :(得分:1)

我对老师提供的代码感到非常惊讶;通常它很糟糕,但这个很不错。虽然您只需要修改一个类,但请允许我多注释一下,因为&#34;任何信息都会有帮助&#34;

<强>控制器

class Controller extends MouseAdapter

而不是

class Controller implements MouseListener

允许你摆脱所有空方法

public void mouseReleased(MouseEvent e) {    }
public void mouseEntered(MouseEvent e) {    }
public void mouseExited(MouseEvent e) {    }
public void mouseClicked(MouseEvent e) {    }

(如果您需要使用其他内容扩展控制器,只需将内部类扩展为MouseAdapter并使用它。)

<强>龟

应该公开构造函数,例如

Turtle(int x, int y) {

    this();
    this.x = x;
    this.y = y;
}

这样

Turtle t = new Turtle();
t.setX(4);
t.setY(6);

可以替换为

new Turtle(4, 6);

此外,dest_xdest_y应重命名为destXdestY,因为下划线(_)仅用于final个实例的名称

最后,您需要替换

// Draw the turtle

g.drawImage(image, x, y, null);

查看

中指定的尺寸
setSize(1000, 700);

应定义为字段(不要在代码中散布任意数字)

int sizeX = 1000, sizeY = 700;
...
setSize(sizeX, sizeY);

并且应该暴露出来,以便在选择海龟的初始位置时,他们不会开始越界。

<强>模型

您被问到:Modify the Model class to store an ArrayList of Turtles,但由于某种原因您创建了一个数组。以下是您可以采取的措施:

public class Model {

    private List<Turtle> turtList = new ArrayList<>();
    private int turtleNumber = 3;

    Model() throws IOException {

        for (int i = 0; i < turtleNumber; i++) {
            Turtle turt = new Turtle();
            turt.setX(Math.round((float)Math.random() * 1000));
            turt.setY(Math.round((float)Math.random() * 700));
            turtList.add(turt);
        }
    }

    public void update(Graphics g) {

        for (int i = 0; i < turtleNumber; i++)
            turtList.get(i).update(g);
    }

    public void setDestination(int x, int y, int width, int height) {

        for (Turtle turt : turtList)
            turt.setDest(x, y);
    }
}

我将我想要的海龟数量定义为一个字段,并在整个代码中使用它,所以当我更改数字时,我只需要在一个地方更改它。

在构造函数中,我使用给定的turtle构造函数(一个空构造函数)进行循环,然后将它们随机地放在框架的边界内(它们应该从View&#39; s {{1 }和sizeX)。然后我将修改后的乌龟添加到列表中。

出于教学目的,我为sizeYupdate使用了两种不同的循环结构。选择你想要的任何一个(只需注意你不需要知道海龟的数量)。

答案 1 :(得分:0)

Model课程的构造函数中,您有

Turtle[] t = new  Turtle[3];

您还有类变量

Turtle[] t

但是没有将构造函数中初始化的数组赋值给类变量,因此只考虑该方法的范围,因此不会绘制任何内容,就像以后再使用变量t一样它尚未初始化,因此您获得NullPointerExceptions

要解决此问题,只需更改行

即可
Turtle[] t = new  Turtle[3];

t = new  Turtle[3];

现在这只会显示为一张图片,但实际上是3只乌龟叠加在一起。所以要解决这个问题,你需要一些额外的代码才能把海龟放在不同的起始位置,但是我会让你把这部分搞清楚。