2011-01-30 16 views
3

私はクライアントのためにcostum JTableを開発しています。JTable、TableModel、TableColumnModel - 奇妙なことが起こっている

テーブルモデルを開始したときに、私はちょうど列モデルを完成させました。テーブルモデルの列に関連するほとんどの関数は、実際には列モデルの関数のエイリアスです。

とにかく、何か本当に奇妙なことが起こった。誰かが私に助けてくれることを願っています:

  1. JTableは列を正しく示しています。つまり、getColumnCountとgetColumnNameは正しく動作しています。

  2. 行数が正しく表示されています。つまり、getRowCountは正常に動作しています。

  3. テーブルモデルの«getColumnCount»が列モデルのgetColumnCountの値を返すため、各行のセル数が正しく表示されます。

    各行の最初のセルの値が正しい:

は今、ここに奇妙なことをしています。しかし、同じ行の他のすべてのセルでは同じままです。

あなたの大部分のように、getValueAtには何か問題があると私は推測しました。だから、テーブルがレンダリングされた後、そのテーブルへの呼び出しをハードコードすることにしました。そして、値は正しいものに戻った。

デバッグ後、getValueAt(rowIndex、columnIndex)の代わりに 'getValueAt(rowIndex、0)'を呼び出すJTableが見つかりました。

誰もがこれを手伝ってくれますか?敬具...

テーブルモデル

/** 
* 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); 
} 

そして、そのハードコードされたテスト。

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

答えて

5

各行の最初のセルの値が正しい:3個の細胞それぞれと2行。しかし、同じ行の他のすべてのセルでは同じままです。

あなたのTableColumnが正しく作成されていません。

TableColumnには、表示するデータが列に含まれるTableModelへのインデックスが含まれています。 TableColumnを作成すると、この値はデフォルトで0になります(同じデータがすべての列に表示されます)。

私はあなたが実際のTableColumnを作成し、あなたのコードのどこに表示されていないが、あなたが使用してはいけません。

TableColumn tc = new TableColumn(); 

を代わりに使用してする必要があります。

TableColumn tc = new TableColumn(modelIndex); 
+0

ありがとう、私はそこに起こっていることについて多くのことを考えました。 – flash

+0

@flash、origianlのポスターでさえなかったとしても、あなたは答えを嬉しく思っています:) – camickr

+0

これは本当に役に立ちました。ありがとう – ali

0

テーブルの列のインデックスを索引は動的に変更されるため、列を非表示にするか、必要に応じて表示に戻すことができます。

これは実際にテーブルモデルによって実行されていました。

とにかく、わかりました。私は何が起こったのか本当に知りません。テーブルモデルを削除したのは、実際にテーブルモデルを必要としないとわかったからで、テーブルモデルを最初からやったからです。今はうまくいきます。

ありがとうとにかく=)

関連する問題