Как обновить содержимое JTable?

134
28 мая 2019, 19:00

Не получается обновить содержимое JTable при изменении DefaultTableModel. Общая идея такова: создается меню с тремя подпунктами - таблицами из базы данных. При нажатии на один из подпунктов JTable заполняется данными и выводится на экран. Проблема в том, что хотя при компиляции указанная таблица выводится на экран, при выборе другой таблицы в меню на экране не отображаются изменения. Как правильно "заставить" JTable обновить свою TableModel?

Код меню:

    Font font = new Font("Verdana", Font.PLAIN, 11);
    JMenuBar menuBar = new JMenuBar();
    JMenu DBOperationsMenu = new JMenu("DB operations");
    DBOperationsMenu.setFont(font);
    JMenu entityMenu = new JMenu("Show entity");
    entityMenu.setFont(font);
    DBOperationsMenu.add(entityMenu);
    JMenuItem ClientItem = new JMenuItem("Client");
    ClientItem.setFont(font);
    entityMenu.add(ClientItem);
    JMenuItem EventItem = new JMenuItem("Event");
    EventItem.setFont(font);
    entityMenu.add(EventItem);

Код вывода новой сущности в JTable:

    ClientItem.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            String entity = "client";
            CreateDBTableAndPane(entity);
        }
    });

Cоздание таблицы и заполнение:

    public static JScrollPane CreateDBTableAndPane(String entity) {
    JTable dbTable = new JTable();
    DefaultTableModel dtm = null;
    if(entity.equals("client")) {
        dtm = Client.FillDataModel(dbTable);
    }
    if(entity.equals("event")) {
        dtm = Event.FillDataModel(dbTable);
    }
    dbTable.setModel(dtm);
    JScrollPane scrollPane = new JScrollPane(dbTable);
    refresh(dtm);
    return scrollPane;
}
     public static DefaultTableModel FillDataModel(JTable clientTable) {
    ArrayList<Client> list = Forms.CreateEntityList("client");
    DefaultTableModel dtm = (DefaultTableModel) clientTable.getModel();
    dtm.setColumnIdentifiers(Client.columnNames);
    Object[] row = new Object[7];
    for (int i = 0; i < list.size(); i++) {
        row[0] = list.get(i).GetId();
        row[1] = list.get(i).GetClientName();
        row[2] = list.get(i).GetClientDOB();
        row[3] = list.get(i).GetClientPhone();
        row[4] = list.get(i).GetClientEmail();
        row[5] = list.get(i).GetClientGender();
        row[6] = list.get(i).GetClientAdress();
        dtm.addRow(row);
    }
    return dtm;
}
Answer 1

Ваш слушатель вызывает метод CreateDBTableAndPane который формирует новую таблицу и кладет на новый JScrollPanel, и возвращает его. Но вы с ним ничего не делаете. Надо удалить прошлый JScrollPanel и вставить новый.

ClientItem.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        String entity = "client";
        JScrollPanel newScroll = CreateDBTableAndPane(entity);
        <панель на которой лежит scroll>.remove(<старый scroll>);
        <панель на которой лежит scroll>.add(newScroll );
    }
});
READ ALSO
SQLiteLog: (1) no such table for Android 9

SQLiteLog: (1) no such table for Android 9

Возникла проблема с Android 9Использую "стандартный" класс MyDataBaseOpenHelper extends SQLiteOpenHelper С выходом андроид 9 появилась проблема android

208
Не получается добавить шрифт neris

Не получается добавить шрифт neris

У меня есть вопрос, не могу подключить к верстаемой странице на своем ПК шрифт neris

150