2013-04-30 1 views
0

내 프로그램에서 JTable에 일부 데이터를 표시하려고합니다. 데이터를 포함하는 클래스가 있으므로 JTable에있는 가장 쉬운 방법은 클래스를 확장하여 TableModel 인터페이스를 구현하고 JTable의 모델로 사용하는 것 같습니다. 불행히도 그것은 나를 위해 올바르게 작동하지 않습니다. 프로그램에서 JTable을 그릴 때 에 NullPointerException이 발생합니다. 왜? Java TableModel 구현으로 프로그램이 충돌 함

package bridgecalc; 

import java.util.HashSet; 

import javax.swing.event.TableModelListener; 
import javax.swing.table.TableModel; 

public class MyTableModel extends MyDataClass implements TableModel { 

    private static final long serialVersionUID = 1L; 
    // private Object[][] data; //this is in fact declared in the superclass 
    private static final String[] colNames = {"bla", "blabla", "hola", "hej", "egle", "begle", "eciepecie"}; 
    private HashSet<TableModelListener> listeners; 

    public MyTableModel() { 
     data = new Object[7][7]; 
     listeners = new HashSet<TableModelListener>(); 
    } 

    @Override 
    public int getColumnCount() { 
     return data.length; 
    } 

    @Override 
    public int getRowCount() { 
     return data[0].length; 
    } 

    @Override 
    public Object getValueAt(int arg0, int arg1) { 
     return data[arg0][arg1]; 
    } 

    @Override 
    public void addTableModelListener(TableModelListener l) { 
     listeners.add(l); 
    } 

    @Override 
    public Class<?> getColumnClass(int columnIndex) { 
     return null; 
    } 

    @Override 
    public String getColumnName(int columnIndex) { 
     return colNames[columnIndex]; 
    } 

    @Override 
    public boolean isCellEditable(int rowIndex, int columnIndex) { 
     if (rowIndex == columnIndex) 
      return false; 
     else return true; 
    } 

    @Override 
    public void removeTableModelListener(TableModelListener l) {   
     listeners.remove(l); 
    } 

    @Override 
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) { 
     data[columnIndex][rowIndex] = aValue; 
    } 

} 

그리고 어딘가에 프로그램

: 사전에 어떤 도움

... 
JTable table = new JTable(new MyTableModel()); 
this.setViewportView(table); 
... 

감사합니다.

답변

2

아마 당신의 문제는 getColumnClass()이 기본 클래스로 대신 Object.class

사용 AbstractTableModel가 null이 반환했다. 이렇게하면 많은 방법이 필요하지 않습니다. 이벤트에 필요한 모든 이벤트를 처리하기 시작했습니다. 이를 원한다면 Oracle/Sun 소스 또는 다른 소스를 사용하여 'AbstractTableModel'에서 해당 코드를 복사하십시오. 다음은 이벤트를 처리 할 코드의 양을 알려주는 몇 가지 버전의 소스입니다. Java Source for AbstractTableModel

public class MyTableModel extends AbstractTableModle { 

private MyDataClass myData; // holds the cell data 

private static final String[] colNames = {"bla", "blabla", "hola", "hej", "egle", "begle", "eciepecie"}; 

public MyTableModel(MyDataClass val) { 
    myData = val; 
    myData.data = new Object[7][7]; 
} 

@Override 
public int getColumnCount() { 
    return myData.data.length; 
} 

@Override 
public int getRowCount() { 
    return myData.data[0].length; 
} 

@Override 
public Object getValueAt(int arg0, int arg1) { 
    return myData.data[arg0][arg1]; 
} 

@Override 
public String getColumnName(int columnIndex) { 
    return colNames[columnIndex]; 
} 

@Override 
public boolean isCellEditable(int rowIndex, int columnIndex) { 
    if (rowIndex == columnIndex) 
     return false; 
    else return true; 
} 

@Override 
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) { 
     myData.data[columnIndex][rowIndex] = aValue; 
    } 

} 
+0

감사합니다. 나는 그것을 고려했다. 의도적으로'AbstractTableModel'을 확장하는 대신'TableModel'을 구현하기로 결정했습니다. MyDataClass는 내 데이터에 편리한 conatainer이며 몇 가지 추가 방법 만 필요합니다. Extending'AbstractTableModel'은 많은 코드를 purpouse로 다시 작성하도록 강요합니다 ... – Sventimir

+0

이벤트 핸들링이 코드에 없으면 훨씬 더 깨끗합니다. 정말로 첫 번째 줄에 넣은 데이터 클래스에 대한 아이디어를 시도해보십시오. –

+0

내 코드에서 이벤트를 처리하지 않습니다. 나는 청취자 만 관리합니다 ... 당신의 sollution 잘 작동합니다, 많이 고마워요! :) – Sventimir