Схема наблюдателя на GWT - PullRequest
1 голос
/ 05 августа 2010

Привет!Я относительно новичок как в GWT, так и в Java-программировании (или ООП в этом отношении), поэтому заранее извиняюсь за вопросы / ошибки для начинающих.Я пытался создать какой-то шаблон наблюдателя, но консоль режима разработки продолжает сбрасывать сообщения об ошибках, и, к сожалению, они далеко не полезны.

Итак, вот что я пытаюсь достичь: - ЯУ меня есть модель, которая состоит из класса Country и хранит значение, называемое Influence.- Представление является классом с именем CountryDisplay.Это виджет GWT, который всегда должен отображать текущее влияние данной страны.

public class Country {
   private int influece;
   private CountryDisplay display;

   public Country() {
      influence = 0;
   }
   public void setDisplay(CountryDisplay display) //...
   public int getInfluence() //...
   public void setInfluence(int value) {
      influence = value;
      display.update();
   }
}
public class CountryDisplay {

   private Country country;

   public CountryDisplay (Country country) {
      //GWT widget creating stuff
      this.country = country;
   }
   public void update() {
      //InfluenceCounter is a simple Label
      InfluenceCounter.setText(Integer.toString(country.getInfluence()));
   }
}

Затем в классе EntryPoint я делаю что-то вроде этого:

Country italy = new Country(); 
CountryDisplay italyDisplay = new CountryDisplay(italy);
italy.setDisplay(italyDisplay);
RootPanel.get("nameFieldContainer").add(italyDisplay);
italy.setInfluence(3);

Консоль разработки показала, чтовозникла проблема со строкой "display.update ();"в классе Страна.Мое первое предположение состояло в том, что проблема заключалась в том, что отображение не было инициировано, поэтому я создал для него интерфейс, а в конструкторе Country я создал пустой новый дисплей, который впоследствии будет перезаписан.

   public Country() {
      influence = 0;
      display = new DisplayInterface() {
          public void update() {}
      }
   }  

Но мне тоже не повезло.Я думаю, что такого рода перекрестные ссылки не допускаются?Я имею в виду, что представление имеет модель в качестве переменной и наоборот.При индивидуальном вызове метода для представления (например,

italy.setInfluence(3);
italyDisplay.displayTheCurrentValue();

) он работает, поэтому проблема определенно заключается в логике наблюдателя.

1 Ответ

0 голосов
/ 03 июня 2011

Если я правильно понимаю, вы пытаетесь "привязать" элементы пользовательского интерфейса (ваш класс просмотра CountryDisplay) к данным (класс модели Country). «Связать» в том смысле, что если вы измените данные модели (например, вызовите italy.setInfluence(10)), то представление автоматически обновится, чтобы отразить это изменение. И если ваш взгляд предоставил редактор, вы хотите, чтобы «переплет» также работал в другом направлении.

Существует несколько платформ для достижения этой цели, см., Например, публикацию Лучшее решение для привязки данных для GWT . Я использовал GWT Pectin и есть GWT Editors framework (которую я еще не использовал сам, поскольку он относительно новый).

Глядя на ваш код, я чувствую, что вы можете более четко отделить модель от представления: ваш класс модели (Country) не должен знать о классе представления, то есть он не должен хранить ссылку на CountryDisplay.

...