此刻,我很不知所措。我只用了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();
}
}
答案 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_x
和dest_y
应重命名为destX
和destY
,因为下划线(_)仅用于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
)。然后我将修改后的乌龟添加到列表中。
出于教学目的,我为sizeY
和update
使用了两种不同的循环结构。选择你想要的任何一个(只需注意你不需要知道海龟的数量)。
答案 1 :(得分:0)
在Model
课程的构造函数中,您有
Turtle[] t = new Turtle[3];
您还有类变量
Turtle[] t
但是没有将构造函数中初始化的数组赋值给类变量,因此只考虑该方法的范围,因此不会绘制任何内容,就像以后再使用变量t
一样它尚未初始化,因此您获得NullPointerExceptions
要解决此问题,只需更改行
即可Turtle[] t = new Turtle[3];
到
t = new Turtle[3];
现在这只会显示为一张图片,但实际上是3只乌龟叠加在一起。所以要解决这个问题,你需要一些额外的代码才能把海龟放在不同的起始位置,但是我会让你把这部分搞清楚。