2013-02-08 4 views
2

Вот простой пример проблемы, с которой я столкнулся.Обновить JTable после обновления

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

public class Test{ 
    Integer a; 
    Integer b; 

    //getters and setters 

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

} 

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

Я затем связать это с 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); 

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

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

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

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

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

Вот бобы связывания библиотеки Я использую:

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


org.jdesktop.swingbinding.SwingBindings 
+0

Какой тип SwingBindings вы используете? – MadProgrammer

+0

@MadProgrammer Вы имеете в виду библиотеку? Я сделал обновление с этой информацией – user489041

+0

Да, благодарю вас: D – MadProgrammer

ответ

1

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

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

Спасибо за провода trashgod

+0

Я вижу, что «JTableBinding» работает, установив пользовательскую модель на целевой JTable'. Интересно, будет ли 'refresh()' делать так же, как и 'bind()/unbind()'; 'revalidate()' не требуется. – trashgod

+0

Я попытался удалить bind/unbind и заменить его вызовом обновления на JTableBinding. Это не обновляло составной столбец (если это правильный термин для него). Я думаю, что на одной странице было похоже, что это, вероятно, неверный способ сделать это (путь bind/unbind). – user489041

+0

Да, это выглядит немного тяжело. Есть ли способ переопределить 'setValueAt()' в 'JTableBinding.BindingTableModel'? – trashgod

1

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

+0

Я ценю потенциальных клиентов, но я все еще ломаю голову над этим. Решение имеет отношение к переопределению функции getVale, или это связано с обновлением таблицы? Любая помощь будет принята с благодарностью. – user489041

+0

Существенным является запуск «TableModelEvent», который включает 'c', когда изменяется либо' a', либо 'b'; 'fireTableRowsUpdated()' в 'setValueAt()' для всей строки является простым методом. – trashgod

+0

Похоже, что модель таблицы, используемая JTableBinding, не расширяет AbstractTabelModel.Я не уверен, что может произойти обстрел этого события. – user489041

0

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

bindingGroup.unbind(); 
bindingGroup.bind(); 
+0

Пожалуйста, объясните, что делает код вместо этого, отправляя только код. –

+0

этот код должен был отвязать и связать bindGroup, чтобы обновить содержимое jtable, но я добавлю еще один комментарий об использовании jtablebinding вместо использования связующей группы; потому что bindGroup.unbind(); bindingGroup.bind(); в некоторых случаях дают ошибку, поэтому, когда список, связанный с jtable, изменился, вам нужно обновить или обновить привязку к этой jtable, вызвав unbind jtablebinding, а затем вызовите jtablebinding.bind(); для jtable будет обновляться с новыми данными –

1

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

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

Хорошая идея! Я попробую это – user489041

Смежные вопросы