Java JTable不';t update,调用setValueAt方法不';好像不行
我正在创建一个数独游戏,我在使用JTables时遇到了一些麻烦。。。 我就是不能让它触发事件,因为某些原因,即使在从主类调用setValueAt时,也不会发生任何事情。但在模型内部执行时,它确实起作用。。。 正如您所看到的,我尝试了tableModelListener,但这也不起作用 总结一下我的问题:为什么我的表没有激发事件,而setValuesAt方法没有做任何事情 抽象模型:Java JTable不';t update,调用setValueAt方法不';好像不行,java,swing,jtable,Java,Swing,Jtable,我正在创建一个数独游戏,我在使用JTables时遇到了一些麻烦。。。 我就是不能让它触发事件,因为某些原因,即使在从主类调用setValueAt时,也不会发生任何事情。但在模型内部执行时,它确实起作用。。。 正如您所看到的,我尝试了tableModelListener,但这也不起作用 总结一下我的问题:为什么我的表没有激发事件,而setValuesAt方法没有做任何事情 抽象模型: import java.awt.event.ActionEvent; import javax.swing.Ab
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.table.AbstractTableModel;
class SudokuTableModel extends AbstractTableModel
{
private int[][] data;
private int[][] originalBoard;
/**
*
* @param board the board to be played with
*/
public SudokuTableModel(int[][] board)
{
data = board;
originalBoard = board;
}
@Override
public int getColumnCount()
{
return 9;
}
@Override
public int getRowCount() {
// this
return 9;
}
@Override
public boolean isCellEditable(int row, int col)
{
System.out.println("Is it editable?");
if(originalBoard[row][col]<0) //if the value is -1 -> it is not one of the hints and thus can be edited
//it has to be checked with the original board because the user might want to change something they did
return true;
return false;
}
/**
* @return the value at row, col
*/
@Override
public Object getValueAt(int arg0, int arg1)
{//if its a "sudoku" number, return it, otherwise return null
//^thta doesn't seem to work so we'll just return the value. With the size of the grid, number that is not exactly 1 char will be displayed as 3 dots so its fine
return (data[arg0][arg1]<0)?-1:data[arg0][arg1];
}
/**
*
* @param value changes to this value @
* @param row
* @param col
*/
public boolean setValueAt(int value, int row, int col, int randomValue)
{
originalBoard[row][col]=value;
System.out.println("Setting value");
fireTableCellUpdated(row, col);
return true;
}
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
}
导入java.awt.event.ActionEvent;
导入javax.swing.AbstractAction;
导入javax.swing.Action;
导入javax.swing.table.AbstractTableModel;
类SudokuTableModel扩展了AbstractTableModel
{
私有int[][]数据;
私有int[][]原始板;
/**
*
*@param board要玩的棋盘
*/
公共SudokuTableModel(int[][]板)
{
数据=电路板;
原始板=板;
}
@凌驾
public int getColumnCount()
{
返回9;
}
@凌驾
public int getRowCount(){
//这个
返回9;
}
@凌驾
公共布尔值可编辑(int行,int列)
{
System.out.println(“它可编辑吗?”);
如果(originalBoard[row][col],则它不是提示之一,因此可以编辑
//它必须与原始板进行检查,因为用户可能希望更改他们所做的事情
返回true;
返回false;
}
/**
*@返回第行、第列的值
*/
@凌驾
公共对象getValueAt(int arg0,int arg1)
{//如果它是一个“数独”数字,则返回它,否则返回null
//^thta似乎不起作用,所以我们只返回值。根据网格的大小,不完全是1个字符的数字将显示为3个点,这样就可以了
返回(数据[arg0][arg1]
- 出于某种原因,在模型、数据和原始板中有两个二维int数组
- 第一个数组data通过
getValueAt(…)
- 第二个数组originalBoard,通过
setValueAt(…)
向模型添加数据
- 这种差异意味着向模型中添加数据不会对JTable中显示的数据产生任何影响,这就引出了一个问题——为什么要这样设置模型
你说,
总结一下我的问题,为什么我的表不能触发事件,不能设置ValueSat
我敢打赌表事件确实会被触发,但是由于数据数组所保存的数据永远不会改变,JTable永远不会改变它的显示
如果您希望添加新数据以更新显示,那么获取数据的数组应该与显示数据的数组相同。至少这对我来说是最有意义的
编辑:
关于:
遗憾的是,我不这么认为。这种设计是我在发现数组只是“引用”之前所做的,因此实际上这两个数组应该是相同的。另一个问题是,我将System.out.print放入setValueAt,当我从模型内部调用它时(从外部调用get valueAt,然后调用setValueAT)它工作得很好,它设置了值,甚至在我从外部调用该方法时触发了它,尽管它不工作
对不起,你说得对。我收回上面的回答
但是,另一个潜在的问题是:您的setValueAt方法不是真正的重写,永远不会被调用,并且您调用的实际AbstractTableModel setValueAt方法永远不会被重写,也不会产生任何效果
摆脱TableModelListener,并将setValueAt更改为:
@Override
public void setValueAt(Object value, int row, int col) {
originalBoard[row][col] = ((Integer) value).intValue();
System.out.println("Setting value");
fireTableCellUpdated(row, col);
// return true;
}
遗憾的是,我不这么认为。这种设计是我在发现数组只是“引用”之前所做的,因此实际上这两个数组应该是相同的。另一个问题是,我将System.out.print放入setValueAt,当我从模型内部调用它时(从外部调用get valueAt,然后调用setValueAT)它工作得很好,它设置了值,甚至在我从外部调用该方法时触发了它,尽管它不工作…@user2970002:对不起,你是对的。请查看编辑以回答。对……我得到了一个“方法setValueAT(int,int,int,int,int)SudokuTableModel类型的必须重写或实现一个超类型方法的错误,因此我刚刚删除了@override…@Switha:请确保调用您的方法,或者使用正确的参数重写抽象类的实际方法。关于最后一个问题,它是否必须更新FireTableCellUpdate()调用?没有它似乎是可行的,但当它设置时,我得到了堆栈溢出…我刚刚检查了oracle的jtable教程,它确实…知道它为什么会这样做吗?它只是不断打印“设置值”,然后堆栈溢出…让我检查我是否不是从代码中的某个地方调用它。
@Override
public void setValueAt(Object value, int row, int col) {
originalBoard[row][col] = ((Integer) value).intValue();
System.out.println("Setting value");
fireTableCellUpdated(row, col);
// return true;
}