1

だから私はループで構築したクラスを持っています。コンストラクターには、円の「グリッド」を作成する 2 つの while ループがあります。授業用のマフラーのはずですが、かっこいいのでチェーンメイルと呼んでいます。とにかく、別の (クライアント) クラスでスカーフの色を変更できるはずです。色を変更するには、明らかに mutator メソッドを追加する必要があります。幸いなことに、objectdraw には setColor() という名前のミューテーターがあります。このクラスに追加しようとすると、グリッドの最後の円のみが変更されることを除いて、問題なく動作します。なぜこれが起こるのかはわかっていますが、それを修正する方法がわかりません。クラスで使用している「典型的な」ミューテーターをコメントアウトしました。

編集:混乱してすみません...これは単なるクラスです。新しい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) を呼び出す

このシナリオでは、報告した結果が得られます。つまり、最後の丸で囲んだ部分だけが色付きます。この問題を解決するには 2 つの方法があります。

  1. まず、あなたがすでに行っていることです
  2. 「プライベート FramedOval リンク」の代わりに create "private ArrayList linkList = new ArrayList; 今すぐ前に、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 に答える