Связывание данных с Java - PullRequest
13 голосов
/ 28 марта 2012

У меня есть приложение с несколькими окнами / представлениями, которые показывают один и тот же объект.Например, у меня есть пользовательский объект с именем и местоположением Strings и ImageIcon для их изображения.

Тогда в моих окнах я буду использовать детали этого пользовательского объекта, как это -

  1. Я создаю JPanel.
  2. Я добавляю в него JLabels (nameLabel, locationLabel, imageLabel)
  3. Я вызываю setText () (или setIcon для imageLabel) для каждой из этих меток, чтобы установить их текст /изображение для данных объекта пользователя.

Я должен неоднократно делать это для

  1. каждого окна, где данные объекта пользователя отображаются
  2. каждый раз, когдапользовательский объект изменен, мне нужно снова вызвать setText () для меток.

В C #, когда я использовал привязку данных, поэтому, когда я обновлял объект, он автоматически отражался в элементе GUI, который был привязан к даннымЭто.Существует ли нечто подобное в Java?

Ответы [ 5 ]

7 голосов
/ 28 марта 2012
3 голосов
/ 28 марта 2012

Есть пример в Java SE Application Design статье привязки данных.

См. AbstractModel, который использует PropertyChangeSupport.

Классы, которые должны заметить, что объект изменился, реализуют PropertyChangeListener (см. AbstractController).

3 голосов
/ 28 марта 2012

Шаблон MVP поможет вам достичь этого. Вы должны написать поднять пользовательские события и присоединить слушатели пользовательского интерфейса, чтобы ответить на эти события (шаблон наблюдателя). Java предоставляет PropertyChangeEvents и PropertyChangeListeners в дополнение к контрактам Observer и Observable.

1 голос
/ 02 июля 2016

я давно пишу с java и c # и Я закодировал свой собственный propertyChangeListeners в Java, имитируя .net и здесь, под моим методом.

Для сериализации этого объекта я закодировал специальные фильтры против сериализатора, т.е. XStream, сериализация нативных объектов Java

Если вам нужно «сделай сам», вы можете использовать мой путь или пройти через инфраструктуру Oracle, как @Pau Kiat Wee связал ее в своем ответе.

Посмотрите JGoodies для связывания данных Swing для более встроенных вещей http://www.jgoodies.com/download/presentations/binding.pdf http://www.jgoodies.com/downloads/demos/

Вот моя реализация,

Ваш бизнес-объект будет расширен из этого абстрактного класса.

Конечно, если вы уже расширяетесь от чего-то другого, и это не один из твоих этот вариант невозможно для тебя.

Скорее всего, у вас нет намерения сериализовать propertyChangeListeners регистрантов и отправлять некоторые данные куда-нибудь вместе с ним (удаленная служба, которая не знает вашего класса, зависящего от пользовательского интерфейса, и это будет головной болью). вот так.

Обратите внимание private void writeObject(java.io.ObjectOutputStream out) и private void readObject(java.io.ObjectInputStream in) подписи. Я намеренно оставил их пустыми, и эти значительные подписи метода считаются Java Object Serialization.

Это наш имитированный интерфейс PropertyChangeEvent, мы будем использовать шаблон наблюдателя для уведомления наших владельцев регистрации.

public interface IPropertyChangedListener extends EventListener {

    public void onPropertyChanged(Object source,String propertyName,Object oldValue,Object newValue);

}

Это наша база DataBusinessObject

public abstract class DataObjectBase implements Serializable {


    private List<IPropertyChangedListener> propertyChangeListeners=new ArrayList<IPropertyChangedListener>();   
    public void addOnPropertyChangedListener(IPropertyChangedListener propertyChangeListener)
    {   
        ensureRegisterListCreated();
        propertyChangeListeners.add(propertyChangeListener);
    }

    public void removeOnPropertyChangedListener(IPropertyChangedListener propertyChangeListener)
    {
        ensureRegisterListCreated();
        propertyChangeListeners.remove(propertyChangeListener);
    }

    public DataObjectBase()
    {
        ensureRegisterListCreated();
    }

    public void ensureRegisterListCreated()
    {
        if(propertyChangeListeners==null)
            propertyChangeListeners=new ArrayList<IPropertyChangedListener>();      
    }

    protected void onPropertyChanged(Object source,String propertyName,Object oldValue,Object newValue)
    {
        if(propertyChangeListeners.size()<=0)
            return;
        for (IPropertyChangedListener listener : propertyChangeListeners) {
            listener.onPropertyChanged(source, propertyName, oldValue, newValue);
        }
    }

    private void writeObject(java.io.ObjectOutputStream out)
             throws IOException
             {

             }

     private void readObject(java.io.ObjectInputStream in)
              throws IOException {


              }

}

Теперь давайте использовать его

dataObject.addOnPropertyChangedListener(new IPropertyChangedListener() {

                @Override
                public void onPropertyChanged(Object source, String propertyName,
                        Object oldValue, Object newValue) {
                    System.out.println(String.format("%s %s %s",propertyName,oldValue,newValue));
//TODO:Fire your UI change now !!!

                }
            });

Вот что вам нужно сделать в вашем dataObject

public class dataObject extends BaseDataObject
{

    private String editable;

    public String getEditable() {
       return editable;
    }

    public void setEditable(String isEditable) {
        String oldValue=this.editable;      
        this.editable = isEditable;
        onPropertyChanged(this,"Editable",oldValue,isEditable);
    }

}

Если ты не хочешь идти по моему пути, или ты не можешь по какой-то причине. Вы должны следовать JGoodies, это кажется лучшим из всех. В демоверсиях скачайте файл JNLP и вы увидите часть DataBinding. При нажатии на стрелку, расположенную вверху справа, появляется раздел кода. Удачи! http://www.jgoodies.com/downloads/demos/

0 голосов
/ 04 января 2017

Используйте файл betterbeansbinding.jar вместо beansbinding.jar

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...