Swing / JTable не обновляется после изменения связанных данных - PullRequest
2 голосов
/ 08 сентября 2010

У меня есть JTable, который привязан к моему бину EventTracker, по сути, это обертка вокруг списка, который я буду использовать только как добавление / очистка (то есть простой журнал). Проблема в том, что когда я добавляю записи в список и пытаюсь вызвать событие, я не вижу никаких изменений. Я использую среду IDE NetBeans.

Компонент EventTracker добавляется в представление и создается как eventTracker1. Оттуда я щелкаю правой кнопкой мыши по столу и выбираю «Содержимое таблицы ...». Модель таблицы привязана к eventTracker1, выражением привязки является '$ {eventList}'. Столбцы настроены правильно для работы с записями в eventList.

// From inside EventTracker.java
public static final String EVENT_LIST_PROPERTY = "eventList"; 
public List getEventList() {
    System.out.println("Handing out eventList with size: " + Integer.toString(eventList.size()));
    return eventList;
}

public void setEventList(List incomingList) {
    List oldList = eventList;
    eventList = new ArrayList(incomingList);
    propertySupport.firePropertyChange(EVENT_LIST_PROPERTY, oldList, eventList);
}

Метод firePropertyChange, кажется, соответствует спецификации, когда мой внешний код работает с setEventList, он, похоже, запускает событие, потому что тогда вызывается getEventList и размер списка увеличивается, как и ожидалось. Просто таблица не рендерится. Что я могу сделать, чтобы сделать эту работу?

Ответы [ 4 ]

2 голосов
/ 09 сентября 2010

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

EventQueue.invokeLater(new Runnable() {

    @Override
    public void run() {
        // update model, which should fire the appropriate event
    }
});
1 голос
/ 09 сентября 2010

Я действительно хотел заставить работать привязку данных. Рекомендуемые ответы: хорошее чтение, но это привело бы меня к написанию большого количества кода. Я не хотел обрабатывать логику подсчета строк / столбцов и всю эту дополнительную работу. В результате это решение может обеспечить меньший контроль, но это довольно быстро и легко для этого рабочего процесса только для чтения.

Документ на http://swinglabs.org/docs/presentations/2007/DesktopMatters/beans-binding-talk.pdf дал мне тощий. Хитрость заключалась в том, чтобы использовать ObservableCollection / ObservableList(new ArrayList<Event>) в качестве хранилища данных. Всякий раз, когда я добавляю другую запись, она автоматически отражается в JTable.

Отлично!

0 голосов
/ 09 сентября 2010

Непонятно, как вы связываете класс EventTracker с таблицей. Я предполагаю, что вы используете соответствующий редактор и класс рендеринга, а затем устанавливаете рендер и редактор, как это table.setDefaultRenderer(EventTracker.class,new EventTrackerRender()); и table.setDefaultEditor(EventTracker.class,new EventTrackerEditor());. Редактор используется только в том случае, если вам нужно изменить компонент EventTracker через таблицу.

Если это сделано вне таблицы (т. Е. Через код), переопределите функцию setValueAt в модели Table, а затем получите объект EventTracker (который является текущим объектом) с помощью getValueAt и внесите необходимые изменения (если Eventtracker является изменяемым объектом) . В случае неизменяемого объекта создайте новый объект EventTracker и установите его в массив объектов. После этого вы должны либо вызвать fireTableDataChanged(), который будет перерисовывать всю таблицу, либо вызвать fireTableCellUpdated(row,col) для повторной визуализации конкретной ячейки. .

0 голосов
/ 09 сентября 2010

Вы должны сообщить таблице, что модель данных изменилась:

.fireTableDataChanged ()

- правильный метод; при условии, что ваша таблица происходит от модели абстрактной таблицы.

(так что да, я согласен с trashgod)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...