Обновления JTable не отображаются - PullRequest
1 голос
/ 16 декабря 2008

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

books = new JTable(new DataTableModel(new Vector<Vector<String>>(), title2));
JScrollPane scroll1 = new JScrollPane(books);
scroll1.setEnabled(true);
scroll1.setVisible(true);
JSplitPane jsp1 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, scroll1, scroll2);
JSplitPane jsp2 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, inventory, jsp1);
myPanel.add(jsp2, BorderLayout.CENTER);

Позже я хочу обновить книги набором данных и использовать следующее:

DataTableModel d = (DataTableModel)books.getModel();
d.setValues(bookList);
books.setModel(d);

где bookList - это Vector<Vector<String>>, который определенно содержит данные. Однако, хотя весь этот код выполняется, он не отображается на экране. Код для метода setValues():

public void setValues(Vector<Vector<String>> v) {
    values = v;
    fireTableDataChanged();
}

Я что-то здесь упускаю?

Класс и методы для моей DataTableModel (все эти методы реализованы для получения правильных результатов):

public class DataTableModel extends AbstractTableModel {
    public DataTableModel(Vector<Vector<String>> v, Vector<String> c) {}

    public int getColumnCount() {
        if (values != null && values.size() > 0)
            return values.elementAt(0).size();
        else
            return 0;
    }

    public int getRowCount() {
        if (values != null && values.size() > 0)
            return values.size();
        else
            return 0;
    }

    public Object getValueAt(int arg0, int arg1) {}
    public void setValues(Vector<Vector<String>> v) {}
    public Vector<Vector<String>> getValues() {}
    public void setColumnNames(Vector<String> columns) {}
    public String getColumnName(int col) {}
}

Ответы [ 3 ]

1 голос
/ 16 декабря 2008

Реализовали ли вы другие методы для TableModel? Если да, то как выглядит ваша реализация? Может быть, вы должны опубликовать свой код модели таблицы, чтобы мы могли его проверить?

Кстати: моя главная ошибка при реализации TableModel заключалась в переопределении getRowCount() и getColumnCount() на return 0. Это скажет таблице, что нет данных для отображения ...

РЕДАКТИРОВАТЬ: Таким образом, вы, кажется, используете что-то вроде AbstractTableModel или DefaultTableModel, верно? Вы переопределили некоторые методы?

РЕДАКТИРОВАТЬ 2: Вы должны вызвать fireTableStructureChanged вместо fireTabeDataChanged(), потому что первоначально ваша табличная модель возвращает 0 для getColumnCount().

РЕДАКТИРОВАТЬ 3: Для дальнейшей оптимизации вашей модели вы должны рассмотреть возможность возврата фиксированного значения для getColumnCount(), если у вас есть данные, которые каждый раз имеют одинаковое количество столбцов. Затем вы можете вызвать fireTabeDataChanged(), который просто загружает новые данные вместо полного построения таблицы и данных (fireTableStructureChanged()) каждый раз.

0 голосов
/ 08 апреля 2015

это решит проблему; вам не разрешено отменять привязку основной группы связывания, но вы указываете jtablebinding для ее обновления следующим образом

Binding b = bindingGroup.getBindings().get(0);
b.unbind();
b.bind();
0 голосов
/ 16 декабря 2008

Это странная проблема. Вы сказали, что DataTableModel реализует TableModel. Так. Если вы не используете абстрактный класс, проблема должна заключаться в том, как вы обрабатываете события. Слушатели действительно зарегистрированы и затем уведомлены? Если можете, отправьте ссылку на источник DataTableModel. Но перед этим убедитесь, что вы правильно обрабатываете слушателей, зарегистрированных в этой модели.

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