Связывание Java JPA, Swing и Beans: изменения в коллекции OneToMany в сущности, которые не сразу отражаются в GUI

Я пытаюсь изучить JPA с Hibernate и привязать его к GUI, встроенному в Netbeans с Beans Binding. Это приложение со списком собак. У каждой собаки может быть от одного до многих щенков. Вы можете добавлять и удалять собак, а для каждой собаки вы можете добавлять и удалять щенков.

Собаки отображаются в JList, когда пользователь выбирает собаку, ее свойства отображаются в JTextFileds, а ее щенки отображаются в JTable. Добавление / удаление собак работает нормально, потому что список, содержащий экземпляры Dog, можно наблюдать.

Щенки Dogs сохраняются в Коллекции в классе Dog с помощью метода получения и установки:

@OneToMany(targetEntity = Puppie.class, fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "dog_id")
private Collection<Puppie> puppies;

public Collection<Puppie> getPuppies() {
    if (puppies == null) {
        puppies = new ArrayList<Puppie>();
    }
    return puppies;
}

public void setPuppies(Collection<Puppie> puppies) {
    Collection<Puppie> oldPuppies = this.puppies;
    this.puppies = puppies;
    changeSupport.firePropertyChange("puppies", oldPuppies, puppies);
}

Когда я добавляю щенка к собаке, выбранной в JList не сразу отражается в JTable. Я должен выбрать другую собаку, а затем повторно выбрать собаку, к которой я добавил щенка, чтобы он появился в JTable. Я использую следующие методы добавления / удаления щенков в классе Dog:

public void addPuppie(Puppie puppie) {
    getPuppies().add(puppie);
}

public void deletePuppie(Puppie puppie) {
    getPuppies().remove(puppie);
}

JTable привязан к JList (а не к списку собак) с $ {selectedElement.puppies} в качестве выражения привязки.

Установщики в Свойство огня класса Puppie изменяется при задании свойств.

Вот код для добавления щенка:

@Action
public void addPuppy() {
    Puppie p = new Puppie();
    p.setName("new puppie");
    entityManager.persist(p);

    int selectedIndex = dogsJList.getSelectedIndex();
    Dog d = (Dog) dogList.get(selectedIndex);
    d.addPuppie(p);
    setSaveNeeded(true);
}

Любая помощь будет принята с благодарностью! Дайте мне знать, если вам нужна дополнительная информация.

С уважением, Хенрик

1
задан divibisan 13 September 2018 в 18:23
поделиться

2 ответа

Похоже, что JTable не обновляется автоматически. Посмотрев на сгенерированный Netbeans код, он очищает выбор в JList, а затем повторно выбирает запись, и, таким образом, JTable обновляется.

Поскольку Netbeans генерирует этот код, я предполагаю, что второй JTable не может быть автоматически обновлен с помощью Bean Binding, и что нужно очистить выделение в JList, а затем повторно выбрать запись.

0
ответ дан 2 September 2019 в 22:22
поделиться

Я думаю, вам нужно изменить метод addPuppie:

public void addPuppie(Puppie puppie) {
   getPuppies().add(puppie);
   changeSupport.firePropertyChange("puppies", oldPuppies, puppies);
} 

Потому что PropertyChangeEvent должен запускаться при изменении Коллекции щенков.

2
ответ дан 2 September 2019 в 22:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: