Как поддерживать актуальность JTable? - PullRequest
0 голосов
/ 14 сентября 2009

Я использую связанную 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();

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

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

Как мне уведомить JTable об изменениях?

Ответы [ 2 ]

0 голосов
/ 22 июля 2016

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

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);           
}
0 голосов
/ 14 сентября 2009

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

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

...