Swing: Single AbstractTableModel для нескольких объектов - PullRequest
3 голосов
/ 25 ноября 2011

У меня есть разные объекты, которые используются для хранения данных из БД в ArrayList<T>.Я должен показать записи каждого в таблице.Я использую AbstractTableModel для первого объекта, над которым я работаю.Класс AbstractTableModel имеет заголовки ArrayList<Relation> и String[].

Мой вопрос: как мне создать тот же AbstractTableModel, который можно использовать для всех объектов.Я имею в виду, что при работе с Relation у меня может быть ArrayList<Relation>, если с Product, может быть ArrayList<Product> ..etc.Написание разных AbstrastTableModel для каждого не очень хорошая идея для меня.Основная проблема возникает с setValueAt, getValue, addRow ....

    @Override
public void setValueAt(Object value, int row, int col) {
    Relation r = data.get(row);     // ArrayList<Relation> data
    switch (col) {
        case 0:
            r.setId(value.toString());
            break;
        case 1: r.setName(value.toString());
            break;
        case 2: r.setStartBalance((Double)value);
            break;
        case 3: r.setCurrentBalance((Double)value);
            break;
    }
}

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

Я знаю, что это немного сложно.Но структура огромна, и создание нового класса AbstractTableModel и JTable для каждого объекта также не очень хорошая идея.

Что вы предлагаете?

Ответы [ 2 ]

3 голосов
/ 25 ноября 2011

Вы можете создать абстракцию для нескольких классов данных, чтобы они отображали такие методы, как setValue (int columnNumber, Object Value) и аналогичный метод getValue ().Затем вы можете написать AbstractTableModel поверх этой новой абстракции.Впоследствии для создания требуемой табличной модели потребуется просто изменить класс данных в конструкторе вашей модели.

Например, у вас может быть интерфейс:

interface DBRow
{
    public void setValue(int columnNumber, Object value);
    public Object getValue(int columnNumber);
}

Классы Product и Relation должны это реализовать итогда ваша модель может работать с интерфейсом DBRow.

Вы также можете напрямую рассмотреть возможность использования набора результатов для заполнения таблиц: модель набора результатов в таблицу

0 голосов
/ 25 ноября 2011

По моему мнению, один AbstractTableModel должен использоваться только для одного типа объекта.Возможно, вам следует пересмотреть свою модель данных.

В любом случае, грязный способ решения этой проблемы может заключаться в использовании ArrayList<Object> в вашем AbstractTableModel и проверке вашего getValue() -метода с помощью instanceof.Затем вы можете решить для каждого типа объекта, какой параметр вы возвращаете для этого конкретного объекта.

Пример:

@Override
public void setValueAt(Object value, int row, int col) {
    Object r = data.get(row);     // ArrayList<Object> data
    switch (col) {
        case 0:
            if (r instanceof Relation) {
               ((Relation)r).setId(value.toString());
            } else {
               // do something with Product
            }
            break;
    }
}

Может ли это работать для вас?

...