1

所以我有一个用循环构造的类。在构造函数中,我有两个 while 循环,它们构成了圆圈的“网格”。它应该是上课用的围巾,但我称它为锁子甲,因为这听起来更酷。无论如何,我们应该能够用不同的(客户端)类来改变围巾的颜色。我显然需要添加一个 mutator 方法来改变颜色。幸运的是,在 objectdraw 中有一个称为 setColor() 的 mutator。它工作得很好,除了当我尝试将它添加到这个类时,它只会改变网格中的最后一个圆圈。我知道为什么会发生这种情况,但我不知道如何解决它。我已经注释掉了我们在课堂上使用的“典型”突变体。

编辑:对不起,混乱的家伙......这只是班级,我有一个客户调用 new ChainMail() 然后对其执行 .setColor() 但它只更改最后一个 framedoval 而不是所有这些。那就是问题所在

import objectdraw.*;
import java.awt.*;

public class ChainMail {

  private FramedOval link;

  public ChainMail(int rows,int links,
                   Location p,Color rgb,
                   DrawingCanvas c) {

    double numRows = 0;

    // create the number of rows specified
    while (numRows < rows) {

      double numLinks = 0;

      // create the number of links specified
      while (numLinks < links) {
        link = new FramedOval(p,12,12,c);
        link.setColor(rgb);

        // update the position
        p.translate(8,0);
        numLinks++;
      }

      // move position back to front col and down one row
      p.translate(-8*links,8);
      numRows++;

    }

  }

  public ChainMail(int rows,int links,Location p,DrawingCanvas c) {
    this(rows,links,p,Color.BLACK,c);
  }

  /* this doesn't work, only changes last circle
   * public void setColor(Color c) {
   *   link.setColor(c);
   * }
   */

}
4

2 回答 2

2

如果您将其移至类(如注释代码所示),那么您从哪里调用此函数?我认为这就是与众不同的原因。假设您正在执行以下操作:

  1. 删除“link.setColor(rgb);” 从 while 循环内部
  2. 取消注释 public void setColor(Color c) 函数
  3. 创建 ChainMail 的实例(比如 myChainMail)
  4. 调用 myChainMail.setColor(c)

这种情况将给出您报告的结果,即只有最后一个圈出的结果是彩色的。有两种方法可以解决这个问题:

  1. 首先是你已经在做的事情
  2. 而不是“私人 FramedOval 链接;” create "private ArrayList linkList = new ArrayList; 现在在 while 创建 FramedOval 类型的链接变量之前。然后在执行 link = new FramedOval(p,12,12,c); 在 while 循环中将其添加到上面创建的 ArrayList 中。现在在 setColor您的类的方法迭代arraylist中的所有项目并为这些项目设置颜色
于 2011-10-13T02:27:35.087 回答
1

我说你把它们扔掉是因为你这样做:

  while (numLinks < links) {
    link = new FramedOval(p,12,12,c);
    link.setColor(rgb);

    // update the position
    p.translate(8,0);
    numLinks++;
  }

但是你在哪里用你创建的 FramedOval 做任何事情呢?每次您创建一个新的 FramedOval 对象并让链接引用它时,先前的引用都会丢失并且可能会被垃圾收集;它被丢弃了,这没有意义。

通常你会做类似的事情:

  List<FramedOval> framedOvalList = new LinkedList<FramedOval>(); // or ArrayList
  while (numLinks < links) {
    link = new FramedOval(p,12,12,c);
    link.setColor(rgb);

    // *** here add the created object to some collection
    framedOvalList.add(link);

    // update the position
    p.translate(8,0);
    numLinks++;
  }

但我没有看到你做任何类似的事情。

于 2011-10-13T03:14:55.253 回答