jgoodies bindings + косвенные изменения - PullRequest
2 голосов
/ 15 апреля 2009

У меня болит мозг, пытаясь понять, как правильно использовать привязки JGoodies в моем приложении.

У меня есть класс Article, который является компонентом, который имеет свойства только для чтения. Article является "простым" компонентом и не управляет прослушивателями свойств, поскольку свойства никогда не меняются. У меня есть Swing JPanel, который я хотел бы использовать для отображения определенных свойств статьи. Разные объекты Article могут просматриваться в разное время.

Я ищу что-то (X), которое выполняет следующие действия через один или несколько объектов:

  1. X содержит текущую статью. Я могу позвонить X.setArticle() и X.getArticle(), чтобы перейти к другой статье. Нет другого способа изменить просматриваемую в данный момент статью, мне нужно пройти через X, чтобы он знал, что я ее изменяю.
  2. Когда я настраиваю свой JPanel, я хочу использовать X для создания JTextFields только для чтения, которые привязаны к различным свойствам просматриваемой статьи (заголовок, авторы и т. Д.)
  3. (это следует из # 1 и # 2) Каждый раз, когда вызывается X.setArticle (), содержимое текстовых полей будет автоматически обновляться.

Я пытался использовать BeanAdapter для извлечения моделей свойств из статьи, содержащейся в ValueHolder, и BasicComponentFactory.createTextField () для создания текстовых полей, и все это работает , за исключением , который я получаю com.jgoodies.binding.beans.PropertyUnboundException жалуется, что у моего класса Article есть несвязанные свойства. Duh! Я знаю это, я просто не могу понять, как правильно подобрать «водопровод», чтобы справиться с этим. Каждый Article не подлежит изменению, но просматриваемая в данный момент статья может указывать на другую.

есть предложения?

1 Ответ

2 голосов
/ 15 апреля 2009

Я понял это.

Я делаю что-то вроде этого:

 // on setup:

 BeanAdapter<Article> adapter = new BeanAdapter<Article>((Article)null,
    false);
 // the "false" in the constructor means don't try to observe property
 // changes within the Article, but we still can observe changes
 // if the Article itself is replaced with a new one.

 JTextField tfAuthors = BasicComponentFactory.createTextField(
     adapter.getValueModel("authors"));
 JTextField tfTitle = BasicComponentFactory.createTextField(
     adapter.getValueModel("title"));

Позже, когда я изменяю объект Article, я просто делаю это:

 public void showArticle(Article article)
 {
     adapter.setBean(article);
 }

и все очень хорошо обновляется на экране.

...