2011-01-30 4 views
3

Я разрабатываю costum JTable для моего клиента.JTable, TableModel и TableColumnModel - странно, что происходит

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

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

  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' 

ответ

5

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

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

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

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

TableColumn tc = new TableColumn(); 

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

TableColumn tc = new TableColumn(modelIndex); 
+0

Спасибо, человек, я много думал о том, что там происходит. – flash

+0

@flash, рад, что вы оценили ответ, даже если плакат origianl не сделал :) – camickr

+0

Это было действительно полезно. благодаря – ali

0

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

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

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

Спасибо anyway =)

Смежные вопросы