Java 使用鼠标事件制作移动图像数组的GUI
我现在对这项任务感到非常不知所措。我刚开始Java编程3周,有人给了我这段代码,让我用我不太熟悉的方式修改它。因此,任何帮助都将不胜感激。我真的很想了解这一点,所以任何信息都会有帮助 我目前正在努力的方向是: “修改模型类以存储海龟的ArrayList。使 Model.update为ArrayList中的每个海龟调用tutle.update 测试一下,在ArrayList中放入两三只海龟,每只从 不同的位置。当您单击(这会导致“setDestination”(设置目的地)时 让所有的海龟都去同一个目的地 在你继续之前要做很多工作。” 在我创建这些海龟阵列之前,有一只海龟表现得很好。现在我已经创建了一个数组,我的面板上没有显示任何内容。不过,它确实可以正确编译。我知道我应该制作单独的图形对象,但是如何以及在哪里制作才是最好的方法呢?下面是代码(在4个单独的文件中): Controller.javaJava 使用鼠标事件制作移动图像数组的GUI,java,arrays,object,user-interface,jpanel,Java,Arrays,Object,User Interface,Jpanel,我现在对这项任务感到非常不知所措。我刚开始Java编程3周,有人给了我这段代码,让我用我不太熟悉的方式修改它。因此,任何帮助都将不胜感激。我真的很想了解这一点,所以任何信息都会有帮助 我目前正在努力的方向是: “修改模型类以存储海龟的ArrayList。使 Model.update为ArrayList中的每个海龟调用tutle.update 测试一下,在ArrayList中放入两三只海龟,每只从 不同的位置。当您单击(这会导致“setDestination”(设置目的地)时 让所有的海龟都去同一
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);
}
}