JTable.updateUI () не обновляет sh мою таблицу - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь обновить sh панель таблицы, когда нажимаю кнопку ЗАГРУЗИТЬ. Метод replaceText () будет вызываться кнопкой LOAD при нажатии GUI. Новый список columnNames и отображаемый контент будут отправлены для обновления моей tableModel, которая расширяет AbstractTableModel. Затем вызывается table.updateUI () для refre sh таблицы.

public class Table {
    private JPanel panel;
    private TableModel model;
    private JTable table;
    private JScrollPane scrollPane;

    public Table(){
        this.panel = new JPanel();
        this.model = new TableModel();
        this.table = new JTable(model);
        this.scrollPane = new JScrollPane(table);
    }

    public void replaceText(ArrayList<String> names, String[][] content){
        model.update(names, content);
        table.updateUI();
    }

    public JPanel build(){
        panel.setSize(1000, 300);
        panel.setLayout(new BorderLayout());
        panel.add(scrollPane, BorderLayout.CENTER);
        panel.setVisible(true);

        return panel;
    }

}

И вот код в моей tableModel:

public class TableModel extends AbstractTableModel {

    String[] colNames = new String[] {};
    String[][] content = new String[][] {};
    @Override
    public int getRowCount() {
        return content.length;
    }

    @Override
    public int getColumnCount() {
        return colNames.length;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        return content[rowIndex][columnIndex];
    }

    public String getColumnName(int columIndex){
        return colNames[columIndex];
    }

    public void update(ArrayList<String> names, String[][] content){
        this.colNames = names.toArray(new String[0]);
        this.content = content;
    }
}

1 Ответ

2 голосов
/ 31 марта 2020
public class TableModel extends AbstractTableModel {

Существует интерфейс под названием TableModel. Не называйте класс так же, как интерфейс. Это сбивает с толку.

table.updateUI();

Вы НЕ должны вызывать updateUI (). Этот метод используется внутри Swing только при изменении LAF. Изменение данных не приводит к изменению LAF.

«Модель» несет ответственность за обновление «представления» при изменении данных модели.

public void update(ArrayList<String> names, String[][] content){
    this.colNames = names.toArray(new String[0]);
    this.content = content;
}

Ваше обновление (…) Метод НЕ уведомляет мнение о том, что данные изменились. Это можно сделать, вызвав метод

fireTableStructureChanged(…);

объекта AbstractTableModel в методе update (…).

Однако я не вижу причин для создания пользовательской TableModel. Я бы предложил вам просто использовать DefaultTableModel. У него есть метод setDataVector(…), который позволяет сбрасывать данные в модели.

...