Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用鼠标事件制作移动图像数组的GUI_Java_Arrays_Object_User Interface_Jpanel - Fatal编程技术网

Java 使用鼠标事件制作移动图像数组的GUI

Java 使用鼠标事件制作移动图像数组的GUI,java,arrays,object,user-interface,jpanel,Java,Arrays,Object,User Interface,Jpanel,我现在对这项任务感到非常不知所措。我刚开始Java编程3周,有人给了我这段代码,让我用我不太熟悉的方式修改它。因此,任何帮助都将不胜感激。我真的很想了解这一点,所以任何信息都会有帮助 我目前正在努力的方向是: “修改模型类以存储海龟的ArrayList。使 Model.update为ArrayList中的每个海龟调用tutle.update 测试一下,在ArrayList中放入两三只海龟,每只从 不同的位置。当您单击(这会导致“setDestination”(设置目的地)时 让所有的海龟都去同一

我现在对这项任务感到非常不知所措。我刚开始Java编程3周,有人给了我这段代码,让我用我不太熟悉的方式修改它。因此,任何帮助都将不胜感激。我真的很想了解这一点,所以任何信息都会有帮助

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

“修改模型类以存储海龟的ArrayList。使 Model.update为ArrayList中的每个海龟调用tutle.update 测试一下,在ArrayList中放入两三只海龟,每只从 不同的位置。当您单击(这会导致“setDestination”(设置目的地)时 让所有的海龟都去同一个目的地 在你继续之前要做很多工作。”

在我创建这些海龟阵列之前,有一只海龟表现得很好。现在我已经创建了一个数组,我的面板上没有显示任何内容。不过,它确实可以正确编译。我知道我应该制作单独的图形对象,但是如何以及在哪里制作才是最好的方法呢?下面是代码(在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[] t = new  Turtle[3];
// Draw the turtle
还有类变量

Turtle[] t
但是没有将构造函数中初始化的数组赋给类变量,因此只考虑该方法的作用域,因此不绘制任何内容,因为当您稍后使用变量
t
时,它尚未初始化,因此您会得到
NullPointerExceptions

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

Turtle[] t = new  Turtle[3];


现在,这将只显示为一个图像,但实际上是3只海龟相互叠加。因此,要解决这个问题,您需要一些额外的代码来将海龟放在不同的起始位置,但我将让您来解决这一部分。

我对老师提供的代码感到非常惊讶;通常情况很糟糕,但这一次还算不错。虽然您只需要修改一个类,但请允许我多加评论,因为“任何信息都会很有帮助”

控制器

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_x
dest_y
应重命名为类似于
destX
destY
的名称,因为下划线(uu)仅用于
最终
实例的名称中

最后,您需要更换线路

Turtle[] t = new  Turtle[3];
// Draw the turtle

查看

中指定的尺寸

setSize(1000, 700);
应定义为字段(不要在代码中散布任意数字)

并且应该暴露在外,以便在为海龟选择初始位置时,它们不会离开边界

型号

要求您:
修改模型类以存储海龟的ArrayList
,但出于某种原因,您创建了一个数组。下面是一个示例,说明如何使其工作:

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);
    }
}
公共类模型{
private List turtList=new ArrayList();
私人套头衫号码=3;
Model()引发IOException{
对于(int i=0;i
我将我想要的海龟数量定义为一个字段,并在整个代码中使用它,所以当我更改数量时,我只需要在一个地方更改它

在构造器中,我使用给定的turtle构造器(空构造器)循环,并将它们随机放置在帧的边界内(它们应该从
视图
sizeX
sizeY
读取)。然后我将修改后的海龟添加到列表中


出于教学目的,我对
update
setDestination
使用了两种不同的循环结构。选择你想要的(注意你不需要知道海龟的数量)。

谢谢你的回复!我不知道我是如何/为什么复制了这个没有包括在内的东西,但即使我修复了那个部分,我的乌龟仍然没有出现。@Heather哦,这很奇怪。。。那还有什么遗漏吗?我想没有。我需要为每只海龟使用一个新的图形对象吗?@Heather不,你不需要单独的图形对象。看看我编辑过的答案,应该早就看到了。哇!你帮我把这个分解了,这对我很有帮助。我真的很感激。在下一个方向上,他说:“将Turtle类的dest_x和dest_y变量设置为静态变量,因为所有Turtle对象实例都将共享相同的目标。另外,将setDest函数设置为静态,并确保从模型中正确调用它。”我将所有内容都设置为静态,但我并不是100%地了解如何从模型中正确地调用它。我不应该让它保持不变,对吗?那么什么是一个很好的参考呢?万分感谢@希瑟,我想你已经掌握了正确绘制图像的方法。既然我们解决了你问题中的问题,我建议你用新的目标和更新的代码创建一个新问题。你可以在那里给这个问题一个链接以保持连续性。是的,我给了。再次感谢!行!我是新来的:)
setSize(1000, 700);
int sizeX = 1000, sizeY = 700;
...
setSize(sizeX, sizeY);
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);
    }
}