2014-03-27 50 views
0

我想創建一個5列的空表並添加行到它。我創建了一個單獨的表模型類,擴展了AbstractTableModel將行添加到模型但未添加。獲取arrayindex超出範圍例外

類是:

public class MyTableModel extends AbstractTableModel 
{ 
    private String[] columnNames = {"Name", 
            "Size", 
            "Directory", 
            "Last Modified Time", 
            "Readable"}; 

    Object[][] data=new Object[][]{ 

    }; 

    public int getColumnCount() 
    { 
     return columnNames.length; 
    } 
    public String getColumnName(int col) 
    { 
     return columnNames[col]; 
    } 
    public Class getColumnClass(int c) 
    { 
     return getValueAt(0, c).getClass(); 
    } 
    public boolean isCellEditable(int row, int col) 
    { 
      if (col < 1) 
     { 
      return false; 
     } 
     else 
     { 
      return false; 
     } 
    } 

    public void setValueAt(Object value, int row, int col) 
    { 
     data[row][col]=value; 

    } 
    public void updateJarTable(Object[] row) 

    { 
     setValueAt(row[0],0,0); 
     fireTableDataChanged(); 
     setValueAt(row[1],0,1); 
     fireTableDataChanged(); 
     setValueAt(row[2],0,2); 
     fireTableDataChanged(); 
     setValueAt(row[3],0,3); 
     fireTableDataChanged(); 
     setValueAt(row[4],0,4); 
     fireTableDataChanged(); 
    } 
    @Override 
    public int getRowCount() { 
     // TODO Auto-generated method stub 
     return data.length; 
    } 
    @Override 
    public Object getValueAt(int rowIndex, int columnIndex) { 
     // TODO Auto-generated method stub 
     return data[rowIndex][columnIndex]; 
    } 
} 

在此之後我創建一個表,並應用該TableModel來作爲:

table=new JTable(new MyTableModel()); 

當我點擊一個按鈕,一個新的行應被追加。

submit.addActionListener(new ActionListener() { 
public void actionPerformed(ActionEvent e) 
{ 
Object[] row={"col1","col2","col3","col4","col5"}; 
model1.updateJarTable(row); 
table.revalidate(); 
} 
}); 

其中MODEL1是:

private MyTableModel model1=new MyTableModel(); 

但是當我運行它在我的方法獲得ArrayIndexOutofBoundsExceptionupdateJarTablesetValueAt

我不知道在哪裏出了問題。請幫我找到它。謝謝 !

+1

最好使用DefaultTableModel而不是重新實現自己的表模型的輪子 – StanislavL

回答

2

花點時間看看你的代碼...

首先做什麼...

table=new JTable(new MyTableModel()); 

那你就......

model1.updateJarTable(row); 

如何model1與您分配給表格的模型相關?

使用try ...

table=new JTable(model1); 

代替,只要確保在你將它應用到表model1被初始化,您不要將其重新分配後(再次做這樣的事情model1 = MyTableModel() ...

ArrayIndexOutofBoundsException是下降的事實,你有一個空數組

Object[][] data=new Object[][]{}; 

0 [R行,0列。

您或者需要重新創建陣列以容納新數據,這並不是那麼容易,或者使用更動態的數據結構,如java.util.List或簡單使用DefaultListModel這樣做。

更新與基於列表模式

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 
import javax.swing.table.AbstractTableModel; 

public class MyTableModel extends AbstractTableModel { 

    private String[] columnNames = {"Name", 
     "Size", 
     "Directory", 
     "Last Modified Time", 
     "Readable"}; 

    List<List> rows; 

    public MyTableModel() { 
     rows = new ArrayList<>(25); 
    } 

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

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

    @Override 
    public Class getColumnClass(int c) { 
     // Don't do this, what happens if the cell value is null?? 
     return getValueAt(0, c).getClass(); 
    } 

    @Override 
    public boolean isCellEditable(int row, int col) { 
     if (col < 1) { 
      return false; 
     } else { 
      return false; 
     } 
    } 

    @Override 
    public void setValueAt(Object value, int row, int col) { 
     List columns = rows.get(row); 
     columns.set(col, value); 
     fireTableCellUpdated(row, col); 
    } 

    public void updateJarTable(Object[] row) { 
     List columns = new ArrayList(row.length); 
     columns.addAll(Arrays.asList(row)); 
     rows.add(columns); 
     fireTableRowsInserted(rows.size() - 1, rows.size() - 1); 
    } 

    @Override 
    public int getRowCount() { 
     // TODO Auto-generated method stub 
     return rows.size(); 
    } 

    @Override 
    public Object getValueAt(int rowIndex, int columnIndex) { 
     List columns = rows.get(rowIndex); 
     return columns.get(rowIndex); 
    } 
} 

或者你可以只是做...

String[] columnNames = {"Name", 
    "Size", 
    "Directory", 
    "Last Modified Time", 
    "Readable"}; 
DefaultTableModel model = new DefaultTableModel(columnNames, 0); 
//... 
Object[] row={"col1","col2","col3","col4","col5"}; 
model.addRow(row); 

,並保存自己的麻煩...

+0

雅偉大的發現。我改變了它並嘗試。我再次得到相同的異常! – Pranesh

+0

@Pranesh對不起,重點是錯誤的問題,檢查更新... – MadProgrammer

+0

我是新來的java和havn't使用列表或向量。你能告訴我如何替換「SetValueAt」和「GetValueAt」方法中的行,如果我使用列表或向量? – Pranesh

3

看來你的問題,在接下來的幾行:

Object[][] data=new Object[][]{ 

}; 

你有數組Object[0][],因爲你不能設置值到,趕上ArrayIndexOutOfBoundsException

1)您可以指定數組的維數。

2)或者例如在List中存儲數據。

3)當設置值時,編程擴展數組,如果需要的話。

也試試DefaultTableModel

+0

如果我使用列表而不是二維數組,我該如何更改「SetValueAt」和「GetValueAt」方法中的行? – Pranesh

1

我已經在相同的上下文中發佈了答案。

請在這裏找到how to add an array to a Jtable when button is clicked java

使用DefaultTableModel並簡單的調用addRow()方法來添加一個新行。

+0

很棒的評論.... – MadProgrammer

+0

@braj即使我已經嘗試過在創建一個新班級之前。但那addRow()方法不起作用。我的表格沒有更新。不知道爲什麼! – Pranesh

+0

請查看上述鏈接上發佈的示例代碼。 – Braj