문제

다음과 같이 사용자 정의 테이블 모델을 구현했습니다.

public class MyTableModel extends AbstractTableModel {
    ...
    ...
    @Override
    public Class getColumnClass(int c) {
        return getValueAt(0, c).getClass();
    }
    ...
    ...
}

위의 TableModel이 있는 JTable을 표시할 때 위의 메서드에서 NullPointerException이 발생합니다.

데이터베이스 테이블의 일부 빈 셀 때문에 예외가 발생했다고 생각합니다.

데이터베이스 테이블의 빈 셀로 인해 예외가 발생한 경우 이 문제를 해결하는 방법은 무엇입니까?

데이터베이스의 모든 열이 특정 값을 갖는 것이 필수는 아닙니다.일부 열에는 아무것도 포함될 수 없습니다.

도움이 되었습니까?

해결책

셀이 빈 값을 포함 할 수 있다면 널 값으로 getClass () 호출하면 확실히 NPE가 제공됩니다. 물론 당신은 null을 확인할 수 있지만 실제 문제는 그보다 더 미묘합니다.

TableModel 인터페이스는이를 지정합니다 getcolumnclass (int) 돌아와야합니다 "열의 모든 셀 값에 대한 가장 구체적인 슈퍼 클래스." 사물의 외관에서 단일 열에 대해 여러 클래스 유형을 반환하여 TableModel 계약을 효과적으로 중단 할 수 있습니다.

일반적으로 열 유형은 주어진 테이블 데이터 세트에 대해 정적입니다. 즉, 기본 테이블 데이터가 변경되지 않으면 열에 대한 클래스가 변경되지 않아야합니다. 왜 그러한 특정 가치를 반환 해야하는지 묻는 것이 중요하다고 생각합니다.

주어진 클래스 유형에 대해 특정한 것을 렌더링하려는 경우 자신의 것을 굴리는 것이 좋습니다. 식탁 인자, 및 세포 당 객체 유형을 결정합니다. 거기에서 필요에 따라 특정 렌더링을 수행 할 수 있습니다.

다른 팁

한 가지 문제는 이러한 특정 좌표에 대해 널을 얻는 이유입니다. 그것이 합법적이고 당신이 특별한 것을 렌더링하기를 원하지 않는다면, 당신이해야 할 일은 null-check and return object.class eg입니다.

   public Class getColumnClass(int c) {
        Object o = getValueAt(0, c);
        if(o==null) return Object.class;
        return o.getClass()
    }

이렇게하면 기본 렌더러가 사용되도록하고 값이 없으므로 아무것도 렌더링되지 않습니다.

아마도:

public Class getColumnClass(int c) {
        return (getValueAt(0, c) == null ? Object.class : getValue(0, c).getClass());
  }

도움이되기를 바랍니다.

지금까지의 답변 외에도 : 모델이 List (이전 질문에서 제안한대로) IndexOutOfBoundsException 당신을 렌더링하려는 경우 JTableTableModel 행이 포함되어 있습니다 (즉 List 비었다). 이것은 불쾌한 가장자리 케이스입니다 (당신이 렌더링하려고 시도하는 것을 깨달았습니다. ResultSet - 당신은 어떻게 알 수 있습니까? ResultSet 비어 있지 않습니까?).

이를 피하기 위해 왜 내가 원래 제안한 것을하지 않고 각 열의 클래스를 ResultSetMetaData?

ResultSetMetaData는 클래스에 대한 정보를 제공하지 않습니다.Java 클래스(예: PostgreSQL 세계의 "cidr" 또는 "int8")에 자동으로 매핑되지 않는 데이터베이스별 데이터 유형을 제공하므로 이 제안(소스 코드는 포함되지 않음) 실제로 도움이 되지 않습니다.

또한 Jason Nichols의 "왜 그러한 특정 값을 반환해야 하는지 묻는 것이 중요하다고 생각합니다"라는 의견은 JTable 클래스가 실제 세계에서 어떻게 사용되는지에 대한 일반적인 단서가 없음을 보여줍니다.

테이블에 행이 없는 이 문제에 대한 해결책을 찾고 싶습니다. 여기서도 전체 열에 대한 셀을 렌더링하는 데 사용해야 하는 Java 클래스가 무엇인지 계속 알 수 있습니다.출력이 변경될 수 있다는 생각은 데이터베이스에 대한 더 많은 무지에 기초합니다. 열 데이터 유형은 해당 열의 정의에 지정되며 해당 내용이 무엇이든 데이터 유형은 어떤 행에 따라 변경되지 않습니다. 다시 찾고 있어요.

물론 데이터베이스의 과제 중 하나는 열 정의가 NULL 값을 허용하거나 허용하지 않을 수 있다는 점이며, 이를 위해 JTable을 하위 클래스로 분류하는 사람은 누구나 이 매우 기본적인 전제를 이해하고 이를 테스트하는 방법을 알아야 합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top