Проблемы с обновлением jtable java - PullRequest
1 голос
/ 08 марта 2012

я создал класс, в котором я создаю свой jtable. У меня есть некоторые проблемы, потому что, когда я пытаюсь обновить его, это не работает (ничего не происходит - я думаю, что способ, которым я пытаюсь обновить это, неправильный?). Что я делаю неправильно?

class tableClass
{
    public Vector rowData = null; 
    public Vector columnNames = null; 
    private JTable jTable; 
    DefaultTableModel model;

    public tableClass(JPanel jPanel, Vector rowDataInput, Vector columnNamesInput)
    {       
        rowData = rowDataInput; 
        columnNames = columnNamesInput;

        jTable = new JTable(rowData, columnNames);
        jTable.setFillsViewportHeight(true);

        JScrollPane jScrollPane = new JScrollPane(jTable);
        jScrollPane.setPreferredSize(new Dimension(300, 100));
        jPanel.add(jScrollPane,BorderLayout.CENTER);
    }

    public void updateTable(Vector rowDataInput)
    {
        rowData = rowDataInput;  
        model =(DefaultTableModel)jTable.getModel();  
        model.fireTableDataChanged();
    }
}

Ответы [ 3 ]

2 голосов
/ 08 марта 2012

Чтобы указать вам правильное направление, это чуть более чистая рабочая версия вашего класса. Если у вас много данных, имейте в виду, что обновление таблиц, как это неэффективно! Вы бы лучше делали подклассы AbstractTableModel самостоятельно и отображали их на любые структуры данных, которые у вас уже есть.

public class Table {
    public Vector<String> columnNames;
    private JTable table;

    public Table(JPanel panel, Vector<Vector<Object>> rowData,
            Vector<String> columnNames) {
        this.columnNames = columnNames;

        table = new JTable(rowData, columnNames);
        table.setFillsViewportHeight(true);

        JScrollPane scrollPane = new JScrollPane(table);
        scrollPane.setPreferredSize(new Dimension(300, 100));
        panel.add(scrollPane, BorderLayout.CENTER);
    }

    public void updateTable(Vector<Vector<Object>> rowData) {
        DefaultTableModel model = (DefaultTableModel) table.getModel();
        model.setDataVector(rowData, columnNames);
    }
1 голос
/ 08 марта 2012

rowData передается JTable в конструкторе.Затем в updateTable вы просто обновляете поле rowData в вашем TableClass.Поэтому ни JTable, ни TableModel ничего не знают о ваших изменениях.Вам необходимо обновить модель таблицы в updateTable.

Другими словами, когда вы обновляете rowData в updateTable, вы не обновляете тот же объект rowData, который вы передали в JTable в своем конструкторе.

Функциональность приведенного ниже класса такая же, как и у вашего класса.Это проясняет, почему то, что вы делаете, не имеет никакого эффекта?Видите ли, rowData никоим образом не является общим для TableClass и JTable.И это не должно быть - вы должны обновлять TableModel.Вы можете реализовать свою собственную TableModel и обновить этот объект своими изменениями.

class tableClass
{
    public Vector columnNames = null; 
    private JTable jTable; 
    DefaultTableModel model;

    public tableClass(JPanel jPanel, Vector rowDataInput, Vector columnNamesInput)
    {       
        Vector rowData = rowDataInput; 
        columnNames = columnNamesInput;

        jTable = new JTable(rowData, columnNames);
        jTable.setFillsViewportHeight(true);

        JScrollPane jScrollPane = new JScrollPane(jTable);
        jScrollPane.setPreferredSize(new Dimension(300, 100));
        jPanel.add(jScrollPane,BorderLayout.CENTER);
    }

    public void updateTable(Vector rowDataInput)
    {
        Vector rowData = rowDataInput;  
        model =(DefaultTableModel)jTable.getModel();  
        model.fireTableDataChanged();
    }
}

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

РЕДАКТИРОВАТЬ Поскольку этот ответ был принят, и после комментариев @kleopatra и использования ответа @ Адама (+1) я обновил приведенный ниже код, чтобы показать, какобновить весь вектор данных или векторов в updateTable.Я бы по-прежнему не делал этого в рабочем коде, но, по крайней мере, это функционально правильно и ближе к вопросу ОП.

class MyTable {
    private Vector columnNames = null; 
    private JTable jTable;

    public tableClass(JPanel jPanel, Vector rowDataInput, Vector columnNamesInput) {
        // ...
        jTable = new JTable(rowData, columnNames);
        // ...
    }

    public void updateTable(Vector rowDataInput) {
        model =(DefaultTableModel)jTable.getModel();

        // Now actually update the model with your new data:
        model.setDataVector(rowDataInput, columnNames);
    }
}

Как я уже сказал, это не очень хороший способ сделать это,но я просто пытаюсь показать вам, почему то, что вы делаете, не работает.:)

0 голосов
/ 08 марта 2012

Когда вы пишете:

rowData = rowDataInput;

это не меняет rowData, которое вы передали jTable в конструкторе.

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