我正在尝试创建一个包含5列并向其添加行的空表。我创建了一个扩展AbstractTableModel
的单独的tablemodel类。
课程是:
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();
但是,当我运行时,我会在方法ArrayIndexOutofBoundsException
和updateJarTable
setValueAt
我不知道我哪里出错了。请帮我找到它。谢谢 !
答案 0 :(得分:3)
在下一行中显示您的问题:
Object[][] data=new Object[][]{
};
您有数组Object[0][]
,因为您无法设置值并捕获ArrayIndexOutOfBoundsException
。
1)您可以指定数组的维度。
2)或者以List
为例存储数据。
3)在设置值时,以编程方式扩展数组(如果需要)。
另请尝试DefaultTableModel
。
答案 1 :(得分:2)
花一点时间看看你的代码......
首先你做...
table=new JTable(new MyTableModel());
然后你做......
model1.updateJarTable(row);
model1
如何与您分配给表格的模型相关?
尝试使用...
table=new JTable(model1);
相反,只需确保model1
在您应用到桌面之前已初始化,并且您以后不再重新分配(再次执行model1 = MyTableModel()
之类的操作...
ArrayIndexOutofBoundsException
归结为你有一个空数组
Object[][] data=new Object[][]{};
0
行,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);
为自己省事......
答案 2 :(得分:1)
我已经在相同的背景下发布了答案。
请在how to add an array to a Jtable when button is clicked java找到。
使用DefaultTableModel
和简单调用addRow()
方法添加新行。