Обновить 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();