문제

나는 현재 리팩토링 a JTable 다양한 유형의 데이터를 표시합니다. 이 리팩토링의 주된 이유는 몇 가지가 있기 때문입니다. ClassCastExceptions (코드를 쓴 저자/친구는 hiatus에 꺼져 있습니다). 큰 코드베이스로 인해 시작 장소에 대해서는 손실됩니다. 누구든지 제안이 있습니까? 나는이 질문의 모호성을 깨닫고 사과한다!

아래에 스택 추적을 포함 시켰습니다. 감사!!

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Boolean
    at javax.swing.JTable$BooleanRenderer.getTableCellRendererComponent(Unknown Source)
    at javax.swing.JTable.prepareRenderer(Unknown Source)
    at javax.swing.plaf.basic.BasicTableUI.paintCell(Unknown Source)
    at javax.swing.plaf.basic.BasicTableUI.paintCells(Unknown Source)
    at javax.swing.plaf.basic.BasicTableUI.paint(Unknown Source)
    at javax.swing.plaf.ComponentUI.update(Unknown Source)
    at javax.swing.JComponent.paintComponent(Unknown Source)
    at javax.swing.JComponent.paint(Unknown Source)
    at javax.swing.JComponent.paintToOffscreen(Unknown Source)
    at javax.swing.BufferStrategyPaintManager.paint(Unknown Source)
    at javax.swing.RepaintManager.paint(Unknown Source)
    at javax.swing.JComponent._paintImmediately(Unknown Source)
    at javax.swing.JComponent.paintImmediately(Unknown Source)
    at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
    at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
    at javax.swing.RepaintManager.seqPaintDirtyRegions(Unknown Source)
    at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
도움이 되었습니까?

해결책

이 오류가 발생합니다 BooleanRenderer 테이블 모델에서 나온 값이 유형이 될 것으로 기대하기 때문입니다. Boolean 그리고 그것에 캐스팅하려고합니다 (AKF의 답변에는 정확한 코드 라인이 있습니다).

내 생각에 처음에는 모델이 돌아올 것으로 예상 된 것입니다. Boolean 주어진 열에 대한 값이지만 한 시점에서 대신 문자열을 반환합니다. 따라서이 주어진 테이블에 어떤 모델이 사용되는지 (사용자 정의 모델입니까? 값을 추가하는 기본 모델입니까?) Boolean.

다른 팁

아마도 테이블에는 체크 박스가 포함되어있을 것입니다 (열 모델에 열에 유형 부울이 포함되어 있음)과 렌더러는 내용을 부울로 변환하려고합니다. 그러나 아마도 내용은 단지 끈 일뿐입니다. 해결책은 테이블의 데이터를 변경하거나 고유 한 렌더러를 만드는 것입니다.

문제는 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);
      }
  }

이 문제를 디버깅하려면 총알을 물고 중단 점을 JTable$BooleanRenderer.getTableCellRendererComponent() 캐스트를 만드는 라인에서

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

(에서 JTable.java 1.288 06/11/15)

클래스 유형을 확인하십시오 value. 당신이 찾을 때 String, 모델에서 불쾌한 열과 행을 식별 할 수 있습니다. 적어도 문제를 식별하는 데 시작할 것입니다.

오래된 질문을 파헤쳐 서 죄송하지만이 문제를 직접 만났고이 게시물이 검색에 나왔고 이것이 제가 출시 한 것입니다.

Junits 테스트가 실패했지만 (실제로 런타임 예외를 던지고 있음) GUI 응용 프로그램을 나쁜 상태에 두는 JTable (Junit 테스트)에서 추가/제거를 계속 실행했습니다. 설명했다.

그래서 나를위한 "수정"은 모든 단위 테스트가 예외를 포착하고 반환 실패를 포착하는지 확인하는 것이 었습니다. 대신에 더 많은 단위 테스트를 실행하는 진행.

나는 같은 문제가 있었고 원인은 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;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top