我正在做一个国际象棋游戏,我需要制作一个打印每一步的日志表。 LogTable类是这样的:
public class LogTable {
private DefaultTableModel model;
private JTable table;
public LogTable(JPanel panel){
String[] columnNames = {"Move No.",
"White",
"Black"};
model = new DefaultTableModel(columnNames, 0);
table = new JTable();
//model.isCellEditable(i, i1)
table.setModel(model);
table.setPreferredScrollableViewportSize(new Dimension(500, 70));
table.setFillsViewportHeight(true);
//Create the scroll pane and add the table to it.
JScrollPane scrollPane = new JScrollPane(table);
panel.add(scrollPane);
}
public void newMove(chessPiece piece){
if (piece.getColor() == 0){
Object[] newRow = new Object[3];
newRow[0] = model.getRowCount()+1;
newRow[1] = piece.sayPos();
newRow[2] = " ";
model.addRow(newRow);
}
else {
model.setValueAt(piece.sayPos(), model.getRowCount(), model.getColumnCount());
}
}
}
但是在第一次黑色移动中它产生了一个ArrayOutOfBoundsException。 newMove函数在chessPiece类中调用:
public void move(int newX, int newY, JPanelSquare jPanelSquareGrid[][], LogTable logTable){
resetShowValidMoves(jPanelSquareGrid);
logTable.newMove(this);
}
其余的移动代码在每个部分,称为超级。我使用的是DefaultTableModel。
答案 0 :(得分:1)
来自Java API:
public DefaultTableModel(Object[] columnNames,int rowCount)
使用与中的元素一样多的列构造DefaultTableModel columnNames和rowCount的null对象值。每列的名称 将从columnNames数组中获取。
您将DefaultTableModel实例化为0行。因此,您无法设置第0行中项目的值,因为它不存在。