0

私は現在JTable、多数の異なるタイプのデータを表示するリファクタリングを行っています。このリファクタリングの主な理由は、いくつかClassCastExceptions(コードを書いた作者/友人が休止状態にある)であり、これらがどこから来ているのかわからないようです。コードベースが大きいため、どこから始めればよいのか途方に暮れています。誰か提案はありますか?この質問のあいまいさを認識し、お詫び申し上げます。

以下にスタックトレースを含めました。ありがとう!!

スレッド「AWT-EventQueue-0」の例外java.lang.ClassCastException:java.lang.Stringをjava.lang.Booleanにキャストできません
    javax.swing.JTable $ BooleanRenderer.getTableCellRendererComponent(Unknown Source)で
    javax.swing.JTable.prepareRenderer(不明なソース)で
    javax.swing.plaf.basic.BasicTableUI.paintCell(不明なソース)で
    javax.swing.plaf.basic.BasicTableUI.paintCells(不明なソース)で
    javax.swing.plaf.basic.BasicTableUI.paint(不明なソース)で
    javax.swing.plaf.ComponentUI.update(不明なソース)で
    javax.swing.JComponent.paintComponent(不明なソース)で
    javax.swing.JComponent.paint(不明なソース)で
    javax.swing.JComponent.paintToOffscreen(不明なソース)で
    javax.swing.BufferStrategyPaintManager.paint(不明なソース)で
    javax.swing.RepaintManager.paint(不明なソース)で
    javax.swing.JComponent._paintImmediately(不明なソース)で
    javax.swing.JComponent.paintImmediately(不明なソース)で
    javax.swing.RepaintManager.paintDirtyRegions(不明なソース)で
    javax.swing.RepaintManager.paintDirtyRegions(不明なソース)で
    javax.swing.RepaintManager.seqPaintDirtyRegions(不明なソース)で
    javax.swing.SystemEventQueueUtilities $ ComponentWorkRequest.run(不明なソース)で
    java.awt.event.InvocationEvent.dispatch(不明なソース)で
    java.awt.EventQueue.dispatchEvent(不明なソース)で
    java.awt.EventDispatchThread.pumpOneEventForFilters(不明なソース)で
    java.awt.EventDispatchThread.pumpEventsForFilter(不明なソース)で
    java.awt.EventDispatchThread.pumpEventsForHierarchy(不明なソース)で
    java.awt.EventDispatchThread.pumpEvents(不明なソース)で
    java.awt.EventDispatchThread.pumpEvents(不明なソース)で
    java.awt.EventDispatchThread.run(不明なソース)で
4

6 に答える 6

3

で発生しているこのエラーはBooleanRenderer、テーブルのモデルからの値が型Booleanであり、それにキャストしようとしているためです(akfの回答には、発生したコードの正確な行が含まれています)。

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

于 2009-06-11T19:07:34.430 に答える
2

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

于 2009-06-10T21:21:05.523 に答える
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);
      }
  }
于 2009-06-10T21:21:40.810 に答える
0

この問題をデバッグするには、弾丸を噛み、JTable$BooleanRenderer.getTableCellRendererComponent() キャストを作成する行にブレークポイントを設定することを検討してください。

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

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

のクラスタイプを確認しvalueます。を見つけたらString、モデルから問題のある列と行を特定できます。これにより、少なくとも問題の特定を開始できます。

于 2009-06-10T21:43:51.233 に答える
0

古い質問を掘り下げて申し訳ありませんが、私は自分でこの問題に遭遇しました。この投稿は検索で出てきました。これが私が遭遇したものです。

JUnitsテストが失敗した(そして実際にランタイム例外をスローした)が、(JUnitテストで)JTableでadd / removeを実行し続けたため、GUIアプリケーションが不良状態になり、ClassCastExceptionがChrisとまったく同じように表示されました。説明していた。

したがって、私にとっての「修正」は、さらに単体テストを実行するのではなく、すべての単体テストが例外をキャッチして失敗を返すようにすることでした。

于 2010-10-12T17:32:44.000 に答える
0

私も同じ問題を抱えていましたが、原因はAvromが指定したとおりでした。私の場合、次のようにgetValueAt実装しました。

@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
  }
}

ここでの問題は、行が存在しない場合、すべての列に対して文字列が返されることです。ただし、一部の列のクラスタイプはブール値であるため、例外があります。

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;
于 2014-03-10T22:48:09.240 に答える