Как установить настраиваемый объект в строке JTable

Я должен сказать это сначала, это НЕ о рендеринге ячейки таблицы.

Вот модель таблицы, которую я создаю, используя 2D-массив на основе объекта User в моей БД.

    List<User> userList = userManagerService.getAllUsers();

    /* String[] col_user = {"Username", "Name", "Phone", .... } */
    String[][] data = new String[userList.size()][col_user.length];
    int i = 0;
    for (User user : userList) {
        String[] userdata = new String[col_user.length];
        userdata[0] = user.getUserUsername();
        userdata[1] = user.getUserName();
        userdata[2] = user.getUserPhone();
        userdata[3] = user.getUserNic();
        userdata[4] = user.getUserAddress();
        userdata[5] = user.getUserEmail();

        data[i++] = userdata;
    }

    VstTableItemModel tiModel = new VstTableItemModel(data, col_user);
    dataTable.setModel(tiModel);

Моя проблема в том, как я могу вернуть объект User, используя выбранную строку в таблице. Обратите внимание, что я не могу создать новый объект User и заполнить его данными строки. Я должен получить запрошенный объект User (объекты в userList). Итак, есть ли способ установить объект со строкой таблицы?

Вот мой VstTableItemModel класс.

public class VstTableItemModel extends AbstractTableModel {

    ArrayList<Object[]> data;
    String[] header;

    public VstTableItemModel(Object[][] obj, String[] header) {
        this.header = header;
        data = new ArrayList<Object[]>();

        for (int i = 0; i < obj.length; ++i) {
            data.add(obj[i]);
        }
    }

    @Override
    public int getRowCount() {
        return data.size();
    }

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

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

    @Override
    public String getColumnName(int index) {
        return header[index];
    }

}

person shan    schedule 24.09.2012    source источник
comment
Вы можете изменить VstTableItemModel?   -  person MadProgrammer    schedule 24.09.2012
comment
да. Мне нужно разместить это здесь?   -  person shan    schedule 24.09.2012
comment
Нет, так будет проще;)   -  person MadProgrammer    schedule 24.09.2012


Ответы (1)


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

Например

public class VstTableItemModel extends AbstractTableModel {

    private List<User> users;

    public VstTableItemModel(List<User> users) {

        this.users = new ArrayList<User>(users);

    }

    @Override
    public int getRowCount() {
        return users.size();
    }

    @Override
    public int getColumnCount() {
        return 6;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {

        Object value = "??";
        User user = users.get(rowIndex);
        switch (columnIndex) {
            case 0:
                value = user.getUserUsername();
                break;
            case 1:
                value = user.getUserName();
                break;
            case 2:
                value = user.getUserPhone();
                break;
            case 3:
                value = user.getUserNic();
                break;
            case 4:
                value = user.getUserAddress();
                break;
            case 5:
                value = user.getUserEmail();
                break;
        }

        return value;

    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        return // Return the class that best represents the column...
    }

    /* Override this if you want the values to be editable...
    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        //....
    }
    */

    /**
     * This will return the user at the specified row...
     * @param row
     * @return 
     */
    public User getUserAt(int row) {
        return users.get(row);
    }

}

Таким образом, вы сможете сделать что-то вроде ...

List<User> userList = userManagerService.getAllUsers();
VstTableItemModel tiModel = new VstTableItemModel(userList);

Теперь, когда вам нужно ... вы можете захватить пользователя, который представлен в определенной строке ...

User user = tiModel.getUserAt(rowIndex);
person MadProgrammer    schedule 24.09.2012
comment
Спасибо. Но что будет, если я его отсортирую? Тогда индекс строки изменится. не так ли? - person shan; 24.09.2012
comment
Если вы используете API сортировки JTable, вы можете просто использовать JTable. convertRowIndexToModel для преобразования индекса строки представления (JTable) в индекс модели. - person MadProgrammer; 24.09.2012
comment
Я должен отметить, что API сортировщика строк (TableRowSorter) использует прокси-модель при сортировке, она фактически не меняет модель данных, а вместо этого сопоставляет индексы между представлением и моделью. - person MadProgrammer; 24.09.2012
comment
Рад, что помог кому-то сегодня: D - person MadProgrammer; 24.09.2012