fireTableDataChanged не влияет на JTable - PullRequest
2 голосов
/ 27 августа 2011

У меня проблема с обновлением JTable в Java Swing.

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

Я использовал метод setModel () для обновления данных, и он работает, НО имеет 2 недостатка:

  1. Если пользователь изменит размер столбцов таблицы в заголовке, он получит около 10 исключений (я думаю, потому что модель больше не доступна, потому что она меняется несколько раз в секунду)

  2. Информация о длине столбца с измененным размером (в пикселях) теряется при каждом изменении данных (а также и TableModel).

Для TableModel я использую свою собственную модель ResultSetTableModel, которая расширяет AbstractTableModel. Этот ResultSetTableModel имеет метод setResultSet(ResultSet rs) и перезаписывает метод getValueAt(x,y) ...

Как я уже сказал, если я устанавливаю новый ResultSet для моего ResultSetTableModel, а затем добавляю его в JTable с помощью метода setModel (resultSetTableModel), он работает, но у него есть 2 недостатка, которые я сказал.

Так что я думаю, что могу решить эту проблему с помощью метода fireTableDataChanged (), но я пробовал много возможностей, но без изменений.

Вы знаете, где я должен разместить праздник?

В данный момент я пробую это, но это не работает, и я не знаю почему:

private ResultSetTableModel resultSetTableModel;
private DataFetcher dataFetcher;
private JTable table;

...

//works fine
public void initaialUpdateTable() {
    resultSetTableModel = new CachingResultSetTableModel(dataFetcher.getRS());
    table.setModel(resultSetTableModel);
}

//does not work
public void updateTable(){
    resultSetTableModel.setResultSet(dataFetcher.getRS());
    resultSetTableModel.fireTableDataChanged();
}

Если я каждый раз вызываю initaialUpdateTable (), он работает нормально, но я хочу, чтобы менялись только данные, а не вся модель

Спасибо за ваши ответы

Michael

Ответы [ 2 ]

1 голос
/ 27 августа 2011
but i want that just the data changes and not the whole model

Хм, как я могу ..., нет только одного ...

1) В графическом интерфейсе вы можете видеть TableView, только уровень представления, и все данные всегда хранятся в TableModel

.

2) Если вы не объявляете TableModel, это не значит, что его не существует, все еще есть DefaultTableModel

3) Ваш private ResultSetTableModel resultSetTableModel; должен расширяться AbstractTableModel,

4) Если вы заблокируете любой из fireXxxXxxChanged();, то никакие изменения не вернутся к TableView,

5) Базовые вещи здесь , начинаются с fireTableCellUpdated(row, col);

EDIT

Больше информации о TableModels здесь , здесь или поиск ResultSetTableModel, TableFromDatabase

0 голосов
/ 27 августа 2011

Извините, у меня нет конкретного ответа на ваш вопрос, но я не могу уместить все, что хочу сказать в комментарии.

Я использовалметод setModel () для обновления данных

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

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

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