2016-11-13 11 views
-2

多次元配列の代わりにハッシュマップを組み込んだJTableを作るのに問題があります。私は自分のカスタムテーブルクラスを使用して、コンストラクタでエラーを取得しています。ここではそのクラスのコードは次のとおりです。JTableのHashMap

import javax.swing.table.DefaultTableModel; 
import java.util.HashMap; 

public class CustomTable extends DefaultTableModel { 
    private String[] columnNames; 
    private HashMap<Integer, Object[]> newData; 

    public CustomTable(HashMap<Integer, Object[]> newData, String[] columnNames) { 
     this.newData = newData; 
     this.columnNames = columnNames; 
    } 

    public int getColumnCount() { return columnNames.length; } 

    public int getRowCount() { return newData.size(); } 

    public String getColumnName(int col) { 
     return columnNames[col]; 
    } 

    public Object getValueAt(int row, int col) { 
     Object[] rowData = newData.get(row); 
     return rowData[col]; 
    } 

    public void setValueAt(Object value, int row, int col) { 
     Object[] rowData = newData.get(row); 
     rowData[col] = value; 

     fireTableCellUpdated(row, col); 
    } 

    public void removeRow(int row) { 
     newData.remove(row); 
     fireTableRowsDeleted(row, row); 
    } 
} 

はここでエラーです:

Exception in thread "main" java.lang.NullPointerException 
    at CustomTable.getRowCount(CustomTable.java:21) 
    at javax.swing.table.DefaultTableModel.setDataVector(DefaultTableModel.java:224) 
    at javax.swing.table.DefaultTableModel.<init>(DefaultTableModel.java:124) 
    at javax.swing.table.DefaultTableModel.<init>(DefaultTableModel.java:106) 
    at javax.swing.table.DefaultTableModel.<init>(DefaultTableModel.java:86) 
    at CustomTable.<init>(CustomTable.java:9) 
    at ControlPanelUI.setupTable(ControlPanelUI.java:22) 
    at ControlPanelUI.createRightCP(ControlPanelUI.java:106) 
    at MovieStore.<init>(MovieStore.java:33) 
    at MovieStore.main(MovieStore.java:16) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) 
+4

エラーは? –

+1

はエラー情報を共有しています! –

+0

(これは問題ではありませんが、あなたは 'removeRow'で番号を付け直しません)' this.newData'を2回割り当てます 'newData'フィールドはおそらく' final'です。コンストラクタ内の変更可能なデータをコピーしてああ、キーが行番号と一致していることを確認してください) –

答えて

0

私の最初の勧告は、HashMapを使用していないです。キーとしてIntegerのポイントは何ですか?データとしてArrayですか?キーはモデルで決して使用されません。ちょうどArrayListを使用してください。

第2に、DefaultTableModelを拡張しないでください。そのクラスは、すでにモデルの記憶域とすべてのメソッドの実装を提供しています。もう一度すべてのメソッドをオーバーライドする必要はありません。代わりにAbstractTableModelを延長する必要があります。

エラーメッセージはsetDataVector(...)メソッドを参照しています。 DefaultTableModelを拡張しているため、このエラーが発生します。代わりにAbstractTableModelを拡張すると、問題はなくなります。