JTable, TableModel и TableColumnModel - Странно нещо става

Разработвам costum JTable за мой клиент.

Тъкмо бях завършил модела на колоната, когато започнах модела на масата. Повечето от функциите, които са свързани с колоните в модела на таблицата, всъщност са псевдоними за функциите в модела на колоните.

Така или иначе се случи нещо наистина странно. Надявам се някой да ми помогне с това:

  1. JTable показва колоната правилно. Което означава, че getColumnCount и getColumnName работят правилно.

  2. Броят на редовете е показан правилно. Което означава, че getRowCount работи правилно.

  3. Броят на клетките за всеки ред се показва правилно, тъй като «getColumnCount» в модела на таблицата връща стойността на getColumnCount в модела на колоната.

Сега идва странното нещо:

Стойността за първата клетка на всеки ред е правилна. Но той остава същият за всички останали клетки в същия ред.

Предположих, както повечето от вас вече направиха, че getValueAt има нещо нередно в него. Така че реших да кодирам твърдо извикване към него, след като таблицата бъде изобразена. И познайте какво: стойността се върна правилна.

След известно отстраняване на грешки разбрах, че това е 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'

person João Pedro Lopes    schedule 30.01.2011    source източник


Отговори (2)


Стойността за първата клетка на всеки ред е правилна. Но той остава същият за всички останали клетки в същия ред.

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

TableColumn съдържа индекса в TableModel, за който колоната съдържа данните за показване. Когато създавате TableColumn, тази стойност по подразбиране е 0 (така че едни и същи данни се показват във всички колони).

Не виждам никъде във вашия код, където всъщност създавате TableColumn, но НЕ трябва да използвате:

TableColumn tc = new TableColumn();

Вместо това трябва да използвате:

TableColumn tc = new TableColumn( modelIndex );
person camickr    schedule 30.01.2011
comment
@flash, радвам се, че оцени отговора, дори ако оригиналният плакат не го направи :) - person camickr; 26.08.2011
comment
Това беше наистина полезно. Благодаря - person ali; 27.03.2012

Индексът на колоната на таблицата не е посочен, тъй като индексът се променя динамично, тъй като колоните могат да бъдат скрити или върнати на видими, когато е необходимо.

Това всъщност се правеше от модела на масата.

Както и да е, разбрах го. Наистина не знам какво се случи. Изпуснах модела на масата, защото реших, че наистина не ми трябва и направих модела на масата от нулата. Сега работи добре.

Благодаря все пак =)

person João Pedro Lopes    schedule 01.02.2011