JTable, TableModel и TableColumnModel - происходит странная вещь - PullRequest
3 голосов
/ 30 января 2011

Я разрабатываю JTable для моего клиента.

Я только что закончил модель столбца, когда начал работать с моделью стола. Большинство функций, связанных со столбцами в модели таблицы, на самом деле являются псевдонимами для функций в модели столбца.

Во всяком случае, произошло нечто действительно странное. Я надеюсь, что кто-то может помочь мне с этим:

  1. Таблица JT правильно отображает столбец. Это означает, что getColumnCount и getColumnName работают правильно.

  2. Количество строк отображается правильно. Это означает, что getRowCount работает правильно.

  3. Количество ячеек для каждой строки отображается правильно, поскольку «getColumnCount» в модели таблицы возвращает значение getColumnCount в модели столбца.

Теперь вот странная вещь:

Значение для первой ячейки каждой строки является правильным. Но это остается тем же самым для всех других ячеек в той же строке.

Я предположил, как и большинство из вас, что getValue в нем что-то не так. Итак, я решил жестко закодировать вызов к нему после рендеринга таблицы. И угадайте, что: значение вернулось правильно.

После некоторой отладки я обнаружил, что это JTable, который вызывает 'getValueAt (rowIndex, 0)' вместо 'getValueAt (rowIndex, columnIndex)'.

Может ли кто-нибудь помочь мне с этим? С наилучшими пожеланиями ...

СТОЛОВАЯ МОДЕЛЬ

/**
 * Returns the value to be displayed for this column at this row index.
 * @param rowIndex
 * @param columnIndex
 * @return
 */
public Object getValueAt(int rowIndex, int columnIndex) {
    System.out.println(String.format("LOS_TableModel: getValueAt(%d, %d)", rowIndex, columnIndex));
    LOS_TableCell cell = this.getCell(columnIndex, rowIndex);
    if(cell == null) return null;
    else return cell.value;
}

/**
 * Returns the LOS_TableCell at the specified JTable indexes
 * @param index
 * @return
 */
public LOS_TableCell getCell(int columnIndex, int rowIndex) {
    for(Object o_row : this.rows) {
        if(o_row.getClass() == LOS_TableRowGroup.class) {
            LOS_TableRowGroup row = (LOS_TableRowGroup) o_row;
            LOS_TableCell cell = row.getCell(columnIndex, rowIndex);
            if(cell != null) return cell;
        }

        else {
            LOS_TableRow row = (LOS_TableRow) o_row;
            for(LOS_TableCell cell : row.cells) 
                if(cell.column.tableIndex == columnIndex && cell.row.tableIndex == rowIndex) return cell;
        }
    }
    return null;
}

/**
 * Returns the number of visible columns
 * @return
 */
public int getColumnCount() {
    int result = this.columnModel.getColumnCount();
    System.out.println("LOS_TableModel : getColumnCount() : " + result);
    return result;
}

/**
 * Returns the total of displayed rows
 * @return
 */
public int getRowCount() {
    int rowCount = 0;
    for(LOS_TableRow row : this.rows) {
        if(row.visible) rowCount += 1;
        if(row.getClass() == LOS_TableRowGroup.class)
            rowCount += ((LOS_TableRowGroup) row).getDisplayedRowCount();
    }
    return rowCount;
}

МОДЕЛЬ КОЛОННЫ

/**
 * Returns an enumeration of columns.
 * @return
 */
public Enumeration<TableColumn> getColumns() {
    Vector<TableColumn> columns = new Vector<TableColumn>();
    for(LOS_TableColumn column : this.columns) 
        if(column.visible) columns.add((TableColumn)column);
    return columns.elements();
}

/**
 * Used by the JTable to get a column index.
 * @param columnIdentifier
 * @return
 */
public int getColumnIndex(Object columnIdentifier) {
    System.out.println("LOS_ColumnModel: getColumnIndex(" + columnIdentifier + ")");
    for(LOS_TableColumn column : this.columns)
        if(column.getIdentifier().equals(columnIdentifier)) return column.tableIndex;
    return -1;
}

/**
 * Return a column using its JTable index
 * @param columnIndex
 * @return
 */
public TableColumn getColumn(int columnIndex) {
    System.out.println("LOS_ColumnModel : getColumn(" + columnIndex + ")");
    for(LOS_TableColumn column : this.columns)
        if(column.tableIndex == columnIndex) return column;
    throw new IndexOutOfBoundsException("" + columnIndex);
}

И это жестко закодированный тест. 2 строки по 3 ячейки в каждой:

System.out.println("=========> " + model.getValueAt(1, 2)); // Outputs 'Cell 1,2'

Ответы [ 2 ]

5 голосов
/ 30 января 2011

Значение для первой ячейки каждой строки является правильным. Но это остается тем же самым для всех других ячеек в той же строке.

Ваш TableColumn создается неправильно.

TableColumn содержит индекс в TableModel, для которого столбец содержит данные для отображения. При создании TableColumn это значение по умолчанию равно 0 (поэтому одни и те же данные отображаются во всех столбцах).

Я не вижу нигде в вашем коде, где вы на самом деле создаете TableColumn, но вы НЕ должны использовать:

TableColumn tc = new TableColumn();

Вместо этого вы должны использовать:

TableColumn tc = new TableColumn( modelIndex );
0 голосов
/ 01 февраля 2011

Индекс столбца таблицы не указан, так как индекс изменяется динамически, поскольку столбцы могут быть скрыты или могут быть возвращены для отображения в случае необходимости.

Это фактически выполнялась моделью таблицы.

Во всяком случае, я понял это.Я действительно не знаю, что случилось.Я бросил модель стола, потому что решил, что она мне действительно не нужна, и сделал модель стола с нуля.Теперь он работает нормально.

В любом случае, спасибо =)

...