Строки, вставленные в DefaultTableModel, не отображаются - PullRequest
1 голос
/ 11 октября 2019

В моем приложении Java 8 я использую SwingWorker для получения некоторых данных из базы данных и вызываю publish, как только я знаю данные для полной строки, которую я затем хочу добавить в свою таблицу:

DefaultTableModel dtm123 = (DefaultTableModel) myTable.getModel();

@Override
protected void process(List<Integer> chunks) {
    if(chunks!=null) {
        ListIterator<Integer> li = chunks.listIterator();

        while(li.hasNext()) {
            dtm123.addRow(myDataList.get(li.next()).getRowArray());
        }                    
    }
}

dtm123.getRowCount() увеличивается каждый раз (я проверял), но таблица не обновляется, чтобы фактически показать новые строки. Я попытался обновить его вручную, но это тоже не сработало:

dtm123.fireTableRowsInserted(0, dtm123.getColumnCount()-1);

Вот странная вещь: если я использую полную версию, она просто отлично заполняет таблицу:

((DefaultTableModel) myTable.getModel()).addRow(myDataList.get(li.next()).getRowArray());

Вы не можете использовать более короткую версию для заполнения таблицы? dtm123 больше нигде не используется, так в чем же разница между двумя версиями?

Редактировать:

Заполнить его напрямую, как это (без SwingWorker) работает:

myTable.setModel(new DefaultTableModel(
    new Object[][] {},
    new Object[] {"blaA","blaB","blaC"}
));

DefaultTableModel dtm123 = (DefaultTableModel) myTable.getModel();
dtm123.addRow(new String[] {"bla1A","bla1B","bla1C"});
dtm123.addRow(new String[] {"bla2A","bla2B","bla2C"});
dtm123.addRow(new String[] {"bla3A","bla3B","bla3C"});
dtm123.addRow(new String[] {"bla4A","bla4B","bla4C"});
dtm123.addRow(new String[] {"bla5A","bla5B","bla5C"});
dtm123.addRow(new String[] {"bla6A","bla6B","bla6C"});
dtm123.addRow(new String[] {"bla7A","bla7B","bla7C"});

Похоже, SwingWoker это проблема, но почему? process работает в основном потоке, который должен использоваться для обновлений пользовательского интерфейса, и нет никаких исключений или сообщений об ошибках.

1 Ответ

0 голосов
/ 14 октября 2019

Исправлено - было две причины, по которым это не работало:

  1. Установка модели таблицы (myTable.setModel(new DefaultTableModel(...add info here...));) и создание столбцов должны быть выполнены напоток main / UI тоже.

  2. process вызывается в, казалось бы, случайный момент времени после вызова publish(), и невозможно заранее определить, сколько будет чанков (можетбыть только одним или всеми из них), поэтому вы должны убедиться, что вы получите DefaultTableModel после , в котором вы установили столбцы. Чтобы гарантировать это, либо настройте столбцы перед тем, как вы вызовете publish() в первый раз (но все еще за пределами doInBackground - см. 1.), либо позвоните publish для «нулевого» времени, чтобы установить их (см. Код ниже),Оглядываясь назад, это кажется довольно очевидным ...

Если вы используете SwingWorker, как я, вы можете сделать что-то вроде:

DefaultTableModel dtm123;

@Override
protected void process(List<Integer> chunks) {
    if(chunks!=null) {
        ListIterator<Integer> li = chunks.listIterator();
        int next;

        while(li.hasNext()) {
            next = li.next();

            if(next==-1) {
                //Set up columns/column titles here
                myTable.setModel(new DefaultTableModel(
                    new Object[][] {},
                    columnHeaderArray
                ));
                dtm123 = (DefaultTableModel) myTable.getModel();
            } else {
                //Add new rows here
                dtm123.addRow(myDataList.get(next).getRowArray());
            }
        }
    }
}

Используйте publish как обычно, но как только вы узнаете названия столбцов, вызовите publish(-1), чтобы настроить их (конечно, перед добавлением строк).

...