2009-06-10 12 views
0

私は現在、異なるタイプのデータの多くを表示JTableリファクタリングです。このリファクタリングの主な理由は、少数のClassCastExceptions(コードを書いた著者/友人は中断しています)であり、これらがどこから由来しているのか分からないようです。大規模なコードベースのため、私はどこから始めればいいか分からない。誰にも何か提案はありますか?私はこの疑問のあいまいさを理解し、謝ります!不明ソース

私は以下のスタックトレースを含んでいます。ありがとう!!

+0

我々は、テーブルの作成コードのいくつかを見ることができます?文字列がある場所があるようですが、テーブルにはブール値が必要です。 –

+0

私は大好きですが、コードはどこにでもあります。非常に悪夢。私は根本的な問題だと思うところに出くわしました。 これらの例外は、行の内容が 'TableRowSorter'によってソートされたときに発生することに言及しておきます。問題は、 'JTable'カラム(またはむしろ1つのカラム)に複数の' CellRender'があり、ソートが発生したときに 'CellRender'が変更されないことです。それに応じてメソッドを変更する方法がありますが、ソート後にメソッドを呼び出す方法がわかりません。 –

+0

'RowSorterListener'はソートをリッスンしますが、残念ながらソートが発生する前にコードを呼び出してしまいます。 私の現在の問題は、ソートの終了後にメソッドを呼び出す方法を考え出すことだと思います。何か案は?すべての助けをありがとう、非常に感謝:) –

答えて

3

テーブルのモデルからある値(AKFの答えは、それが発生したコードの正確な行を有する)タイプBooleanであり、それにキャストしようとすることを期待しているので、BooleanRendererで発生され、このエラーがあります。

私の推測では、最初はそれがモデルに指定した列のBoolean値を返しますが、1つの点で、それは代わりに文字列を返していることが予想されたということです。 したがって、私はこの特定のテーブルのために使用されているものをモデルに集中するだろう(それがカスタムモデルである?それはそれに値を追加されたデフォルトのモデルですか?)、それは代わりにBooleanの文字列を取得することができる場所を確認。

+0

Avrom、あなたは絶対に正しいです - ありがとう。あなたが瞬間を持っているなら/興味があれば、上記の問題の原因に関するmmeyersに私の上記のコメントを見てください。 –

2

おそらくテーブルにチェックボックスがあります(列モデルには、ブール型が含まれていると表示されている)場合、レンダラーは内容をブール値に変換しようとします。しかし、おそらく内容は単なる文字列です。解決策は、テーブル内のデータを変更するか、独自のレンダラーを作成することです。

+0

ブルーノ、 内容はストリングだけではなかった - これは残念なことに私の問題でした。私のコラムには、個々のレンダラに加えて、あらゆる種類のデータ型が含まれていました。私はそれを明示的に言及しなかったので、それは私の悪いことでしたが、あなたのアイデアは間違いなく働いていたでしょう。ご協力いただきありがとうございます。 –

1

私は問題があなたのTableModel(jtable.getModel())から来ていると思います それはどこか

(..) 
public Class<?> getColumnClass(int column) 
    { 
    switch(column) 
    { 
    (...) 
     case XX: return Boolean.class; 
     } 
    } 

言ったが、このコラムでは、モデル内の値は、文字列

public Object getValueAt(int row,int column) 
    { 
    (..) 
    switch(column) 
    { 
    (...) 
     case XX: return (a String); 
     } 
    } 
+0

うん、それは - これは多くの助けとなりました。ありがとう:) –

0

することですこの問題をデバッグすることは、あなたは弾丸をかむとキャストを作るラインでJTable$BooleanRenderer.getTableCellRendererComponent()にブレークポイントを置くことを検討する必要があり

setSelected((value != null && ((Boolean)value).booleanValue()));

JTable.java 1.288 06/11/15から)

valueのクラスタイプをチェック。 Stringが見つかると、モデルから違反している列と行を特定できます。それは少なくとも問題を特定することから始めます。

+0

これは、犯人を見つけるのに非常に役立ちました、ありがとう! –

0

申し訳ありませんが古い質問を掘り起こしましたが、私はこの問題を自分で見つけました&この投稿は検索にあり、これは私が遭遇したものです。

私はJUnitsテストに失敗しました(実際にはランタイム例外を投げます)が、私はJTable(JUnitテストで)に追加/削除を実行してGUIアプリケーションを悪い状態にしてしまい、ClassCastExceptionが表示されますクリスが説明したとおりに正確に

私のための「修正」は、すべての単体テストが例外をキャッチして、不具合を返すことでした。より多くの単体テストを実行してください。

0

私は同じ問題を抱えていた、とAvromが指定されている原因は正確でした。ここ

@Override 
synchronized public Object getValueAt(int row, int col) { 
    if (row < m_rows.size()) { 
    return m_rows.get(row).getValueAt(col); 
    } 
    else 
    { 
    return ""; // THIS IS THE BUG 
    } 
} 

問題を、文字列は、列ごとに、返される行が存在しないということです。私の場合、私はgetValueAtとして実装されていました。しかし、私のコラムの一部は、クラス型、ブール型を持ち、したがって例外:

java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Boolean 
    at javax.swing.JTable$BooleanRenderer.getTableCellRendererComponent(JTable.java:5409) 
    at javax.swing.JTable.prepareRenderer(JTable.java:5736) 

ソリューションは、に戻り値を変更するだけだった。

return null; 
関連する問題