Как обновить JTable без установки новой модели таблицы? - PullRequest
0 голосов
/ 03 июня 2019

Я пытаюсь обновить JTable, используя DefaultTableModel, не обращаясь к самой таблице снова, а только к существующей, но затем обновленной модели таблицы.

Тем не менее, я попытался обновить саму модель таблицы и затем уведомить модель об этом (см. В коде). По какой-то причине таблица не будет обновляться. Я не знаю, если это проблема доступа или это просто невозможно.

//in the Gui_Main class 
private static void addTables(){
   JTable tblMain = new JTable(Util_Tables.dtm);
}

//in the Util_Tables class, if the tables needs to be updated
public static DefaultTableModel dtm;

public static void updateTable(){
   dtm = new DefaultTableModel(data, columns);
   dtm.fireTableDataChanged();
}

1 Ответ

2 голосов
/ 03 июня 2019

Таким образом, ваша основная структура повсюду.Когда вы создаете новый экземпляр DefaultTableModel и присваиваете ему dtm, это не будет отражено JTable, так как он все еще использует экземпляр, который был впервые получен при его создании.

Разоблачение dtm так, как вы это делаете, открывает его для нежелательной модификации и аннулирует один из принципов ОО - инкапсуляции, когда класс отвечает за управление своими свойствами.Это также является причиной для пересмотра использования static

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

private static void addTables(){
   JTable tblMain = new JTable(Util_Tables.getModel());
}


//in the Util_Tables class, if the tables needs to be updated
private DefaultTableModel model;
public static DefaultTableModel getModel() {
    if (model == null) {
        model = new DefaultTableModel();
    }

}

Хорошо, так как насчет обновления модели?Что ж, вам нужно начать с изменения метода updateTable, чтобы его можно было использовать для реального обновления модели осмысленным образом

public static void updateTable(Object[][] data, Object[] columnIdentifiers){
   model.setDataVector(data, columnIdentifiers);
}

Затем модель сама сгенерирует события, в которых она нуждается.Если вы обнаружите, что сами вызываете методы fireXxx, то это хороший признак того, что вы делаете что-то не так.

...