Связывание Java-бинов: адаптеры? - PullRequest
0 голосов
/ 14 апреля 2010

Вот действительно простой класс:

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. Но это плохая модульность, и это заставляет меня добавлять функции получения / установки каждый раз, когда я хочу привязаться к новому аспекту компонента.

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

Извините, если этот вопрос не более понятен, я не знаю словарный запас и немного размыт о понятиях связывания.

1 Ответ

1 голос
/ 14 апреля 2010

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

В вашем случае, как бы вы поступили с тем, кто впервые вводит информацию в текстовое поле, связанное с 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")));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...