2009-09-14 2 views
0

Я использую связанный JTable для отображения списка сущностей.Как сохранить связанную JTable в актуальном состоянии?


    // selSteps is a List of entities. 
    selStepsBound = ObservableCollections.observableList(selSteps); 

    JTableBinding jTableBinding = SwingBindings.createJTableBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, selStepsBound, tblSelSteps, "tblSelStepsBinding"); 
    ColumnBinding columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${steporder}")); 
    columnBinding.setColumnName("Order"); 
    columnBinding.setColumnClass(Integer.class); 
    columnBinding.setEditable(false); 
    columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${name}")); 
    columnBinding.setColumnName("Description"); 
    columnBinding.setColumnClass(String.class); 
    bindingGroup.addBinding(jTableBinding); 
    jTableBinding.bind(); 

    bindingGroup.bind(); 

Это прекрасно работает для отображения исходных данных. Я даже могу удалить элементы из связанного наблюдаемого списка, и я автоматически обновляю JTable-интерфейс.

Проблема заключается в изменении значения свойства объекта, это значение не отражается в JTable UI.

Как сообщить JTable об изменениях?

ответ

0

Я не очень хорошо знаком с материалом SwingBindings, но кажется, что пока ваш список наблюден (т. Е. Слушатели будут уведомлены об изменениях), ваша сущность не является. Поэтому никто не слушает изменения вашей сущности.

Способ, которым я обычно уведомлял JTable об изменении одного из его объектов, заключается в том, чтобы запустить TableModelEvent из модели таблицы. Это то, что JTable прислушивается к самому обновлению. Я обычно расширяюсь от ABstractTableModel, так что я могу назвать приятные функции, такие как fireTableCellUpdated (строка, col) и т. Д. Как эта стратегия может быть смешана с материалом SwingBindings, я не совсем уверен, хотя ...

0

Вам нужно добавьте «поддержку изменений свойств» в вашу организацию. Так что добавьте переменную-член ...

final private PropertyChangeSupport changeSupport = new PropertyChangeSupport(this); 

и методы ...

public void addPropertyChangeListener(PropertyChangeListener listener) { 
    changeSupport.addPropertyChangeListener(listener); 
} 

public void removePropertyChangeListener(PropertyChangeListener listener) { 
    changeSupport.removePropertyChangeListener(listener); 
} 

, а затем в каждом инкубаторе, добавьте строку, подобную этой ...

changeSupport.firePropertyChange("myProperty", oldMyProperty, myProperty);  

например public void setTotalWeight (Integer totalWeight) {

Integer oldTotalWeight = this.totalWeight; 

    this.totalWeight = totalWeight; 

    changeSupport.firePropertyChange("totalWeight", oldTotalWeight, totalWeight);   
}