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

#java #while-loop #mutators

#java #while-цикл #мутаторы

Вопрос:

Итак, у меня есть класс, который я создал с помощью цикла. В конструкторе у меня есть два цикла while, которые создают «сетку» из кругов. Предполагается, что это шарф для класса, но я называю это кольчугой, потому что это звучит круче. В любом случае мы должны иметь возможность изменять цвет шарфа с помощью другого (клиентского) класса. Мне, очевидно, нужно добавить метод мутатора для изменения цвета. К счастью, для этого в objectdraw есть мутатор, называемый setColor(). Он работает просто отлично, за исключением того, что, когда я пытаюсь добавить его в этот класс, он изменяет только последний круг в сетке. Я знаю, почему это происходит, но я не знаю, как это исправить. Я прокомментировал «типичный» мутатор, который мы использовали в классе.

РЕДАКТИРОВАТЬ: Извините за путаницу, ребята … это всего лишь класс, у меня есть клиент, который вызывает 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);
   * }
   */

}
  

Комментарии:

1. Куда вы добавляете свою ссылку на что-либо? Кажется, вы создаете FramedOval в цикле while, но затем, похоже, ничего с этим не делаете, как будто вы просто отбрасываете его.

2. отредактировано, чтобы лучше представить проблему

3. Ваше редактирование, к сожалению, ничего не проясняет. Опять же, вы создаете объекты FramedOval, опять же, вы, похоже, ничего с ними не делаете. Где вы добавляете их в коллекцию, массив, графический интерфейс, что угодно ?

4. Вы отбрасываете их, вы знаете.

5. Я не выбрасываю их ….. этот класс является конструктором, он определяет объект chainmail . Затем в моем клиенте я вызываю new ChainMail() с правильными параметрами, и он рисует обрамленные элементы в сетке, как я хочу…. Я не понимаю, что вы хотите сказать, что я их выбрасываю…

Ответ №1:

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

  1. удалите «link.setColor (rgb);» изнутри цикла while
  2. Раскомментируйте общедоступную функцию void setColor(Color c)
  3. Создайте экземпляр ChainMail (скажем, myChainMail)
  4. Вызовите myChainMail.setColor(c)

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

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

Комментарии:

1. Да …. кто-то еще в классе с большим опытом работы с Java упоминал ArrayLists, но мы никогда не использовали их раньше, поэтому я предположил, что должен быть другой способ сделать это, который ищет учитель.

2. Нет другого способа, кроме как хранить ссылки на экземпляры FramedOval, если вы хотите вызвать любой метод из всех этих экземпляров в отдельной функции

3. Конечно, есть много других способов хранения ссылок, включая массив, если вы заранее знаете, сколько элементов будет сохранено, LinkedList или Maps, наборы, … все зависит от необходимости. Я также рекомендую вам не вызывать свой ArrayList linkList, поскольку это очень запутанно и предполагает, что это действительно LinkedList, а не ArrayList .

4. Я назвал это linkList, потому что это список ссылок. Однако я согласен, что name сбивает с толку, поскольку оно противоречит стандартному DS LinkedList. Вы можете использовать разные имена переменных, такие как listOfLinks, и использовать ArrayList или LinkedList в качестве DS для хранения ссылок на экземпляры FramedOval

Ответ №2:

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

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

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

Комментарии:

1. Хорошо, я неправильно понял, что вы говорили, что я выбрасывал. Вы говорили, что я отбрасываю каждую ссылку, вы правы, я это делаю. Мы еще ничего не узнали о массивах или списках массивов, поэтому я предположил, что есть другой способ. Последний урок перед выполнением домашнего задания будет сегодня, поэтому, если мы не будем говорить о каком-то другом исправлении, я, вероятно, в конечном итоге сделаю что-то вроде этого. Спасибо за вашу помощь.