Метод мутатора Java для чего-то, что было построено с помощью цикла - PullRequest
1 голос
/ 13 октября 2011

Итак, у меня есть класс, который я построил с помощью цикла.В конструкторе у меня есть два цикла while, которые составляют «сетку» окружностей.Это должен быть шарф для класса, но я называю это кольчугой, потому что это звучит круче.В любом случае мы должны иметь возможность изменить цвет шарфа с помощью другого (клиентского) класса.Очевидно, мне нужно добавить метод мутатора, чтобы изменить цвет.К счастью, в 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);
   * }
   */

}

Ответы [ 2 ]

2 голосов
/ 13 октября 2011

Если вы переместите его в класс (как показано в комментарии), откуда вы вызываете эту функцию? Я думаю, что это то, что имеет значение. Предположим, вы делаете следующее:

  1. удалить "link.setColor (rgb);" из цикла while
  2. Раскомментировать функцию public void setColor (Color c)
  3. Создать экземпляр ChainMail (скажем, myChainMail)
  4. Call myChainMail.setColor (c)

Этот сценарий даст результат, о котором вы сообщили, то есть только последний обведенный кружком цвет. Есть 2 способа решения проблемы:

  1. Первое, что вы уже делаете
  2. Вместо "частной ссылки FramedOval"; create "private ArrayList linkList = new ArrayList; Теперь перед тем как создать переменную ссылки типа FramedOval. Затем после того, как вы сделаете link = new FramedOval (p, 12,12, c); в цикле while добавьте это в созданный выше ArrayList. Теперь в методе setColor вашего класса переберите все элементы в массиве и установите цвет для этих элементов
1 голос
/ 13 октября 2011

Я говорю, что вы их выбрасываете, потому что делаете это:

  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++;
  }

Но я не вижу, чтобы ты делал что-то подобное.

...