2010-04-14 3 views
0

Вот очень простой класс:Связывание Java beans: адаптеры?

static public class Bean1 
{ 
    final private String name; 
    final private Bean1 parent; 
    private int favoriteNumber; 

    public String getName() { return this.name; } 
    public Bean getParent() { return this.parent; } 
    public int getFavoriteNumber() { return this.favoriteNumber; } 
    public void setFavoriteNumber(int i) { this.favoriteNumber = i; } 
} 

То, что я хотел бы сделать, это связать некоторые компоненты пользовательского интерфейса к BeanAdapter<Bean1> (см com.jgoodies.binding.beans.BeanAdapter), так что если BeanAdapter указывает на Bean1 bean1, то я могу показать

bean1.name   (blank if null) 
bean1.parent.name (blank if null or if bean1.parent is null) 
bean1.favoriteNumber 

Поля name и favoriteNumber просты, но я смущен тем, как отображать родительское имя. Похоже, что BeanAdapter позволяет мне привязываться к свойствам, которые существуют непосредственно в Bean1. Но это плохая модульность, и это заставляет меня добавлять функции getter/setter каждый раз, когда я хочу привязываться к новому аспекту компонента.

Что я хотел бы сделать, это написать класс-помощник, который знает, как получить доступ к компоненту, и смущен, как заставить его работать с Bean1 и BeanAdapter.

Прошу прощения, если этот вопрос не более ясен, я не знаю словарный запас и немного туман на понятиях привязки.

ответ

1

Проблема здесь состоит в том, что связывание работает в обоих направлениях: от модели к ш, и от щ к модели.

В вашем случае, как вы имеете дело с кем-то, вводящим информацию в первый раз в текстовое поле, связанное с parent.name? Вы бы создали родителя на лету? Не могли бы вы дать ошибку?

Если вы знаете, что делать в этой ситуации (например, создать родитель с таким именем), вы можете использовать com.jgoodies.binding.value.AbstractConverter для преобразования Bean1 к String:

public class ParentNameConverter extends AbstractConverter { 

    /** 
    * Converts a value from the subject to the type or format used 
    * by this converter. 
    * 
    * @param subjectValue the subject's value 
    * @return the converted value in the type or format used by this converter 
    */ 
    public Object convertFromSubject(Object subjectValue) { ... } 


    /** 
    * Sets a new value on the subject, after converting to appropriate type 
    * or format 
    * 
    * @param newValue the ui component's value 
    */ 
    public void setValue(Object newValue) { ... } 
} 

Вы можете использовать этот конвертер то же самое вы используете обычный метод ValueModel:

Bindings.bind(uifield,"value", 
        new ParentNameConverter(beanAdapter.getValueModel("parent"))); 
+0

yay, похоже, что я хочу делать. У меня было очень трудное время, обдумывая основные понятия привязки. Каждый раз, когда мне кажется, что я понимаю, как реализовать задачу, это кажется невозможным, если я не смогу найти базовые инструменты (например, AbstractConverter в этом случае) для работы, иначе вы должны сами написать все, что addPropertyChangeListener. –

+1

, если вы пытаетесь использовать библиотеку привязок вместо заполнения всего своего приложения обработчиками событий, слушателями и т. Д., Вы уже на полпути к отличному качающему приложению! ;) Во всяком случае, я действительно рекомендую эту книгу - http://www.amazon.com/Desktop-Java-Live/dp/0974884332. Несмотря на то, что он был написан в 2005 году, он по-прежнему бьет дерьмо из всех качающихся книг, и в нем есть глава, которая объясняет библиотеку привязок. – alves

Смежные вопросы