Обновить JTable после обновления

Вот простой пример проблемы, с которой я сталкиваюсь.

У меня есть простой класс:

public class Test{
    Integer a;
    Integer b;

    //getters and setters

    public void getC()
    {
        return a + b;
    }

}

Обратите внимание, что у него есть свойство с именем C, которое является суммой a и b.

Затем я связываю это с JTable следующим образом:

List<Test> testList = new ArrayList<Test>();
...add some Test objects to the list
ObservableList observableList = ObservableCollections.observableList(testList);
JTable table = new JTable();
JTableBinding tableBinding = SwingBindings.createJTableBinding(AutoBinding.UpdateStrategy.READ_WRITE, observableList, table); 

Затем я использую следующий код, чтобы добавить привязки для каждого свойства a, b и c тестового объекта. (Обратите внимание, что это просто общий код, который я использую)

BeanProperty beanProperty = BeanProperty.create(properyName);
JTableBinding.ColumnBinding columnBinding = tableBinding.addColumnBinding(beanProperty);
columnBinding.setColumnName(columnName);
columnBinding.setColumnClass(clazz);
columnBinding.setEditable(editable);

Теперь это будет правильно отображать таблицу, но проблема возникает, когда я обновляю a или b в таблице. Поскольку c рассчитывается по a и b, я ожидаю, что c обновится, когда изменится одно из этих значений. Такого не бывает.

Я предполагаю, что таблица нуждается в обновлении, чтобы отразить новое значение сущностей?

Кто-нибудь может объяснить, что мне нужно сделать, чтобы это произошло? Нужно ли добавить свойство привязки дополнительных бинов?

Вот библиотека привязки компонентов, которую я использую:

<dependency>
  <groupId>org.jdesktop</groupId>
  <artifactId>beansbinding</artifactId>
  <version>1.2.1</version>
</dependency>


org.jdesktop.swingbinding.SwingBindings

4 ответа

Решение

С помощью этого вопроса я смог получить необходимую функциональность, переопределив функцию setVale на моем JTable для:

@Override
public void setValueAt(Object value, int row, int col)
{
    super.setValueAt(value, row, col);
    tableBinding.unbind();
    tableBinding.bind();
    revalidate();
}

Спасибо за ведущий trashgod

Я исправляю это немного, это решает проблему; вы не можете отменить привязку главной группы связывания, но вы указываете jtablebinding для ее обновления следующим образом

Binding b = bindingGroup.getBindings().get(0);
b.unbind();
b.bind();

Для справки, здесь обсуждается основная проблема, и здесь приводятся ручные решения как для DefaultTableModel а также AbstractTableModel, По сути, изменение a или же b должен уведомить любого TableModelListener тот c возможно, изменился. Это может помочь при поиске подходящего свойства связывания бобов.

Просто напишите эти две строки после обновления или вставьте

bindingGroup.unbind();
bindingGroup.bind();
Другие вопросы по тегам