Java JTable不';t update,调用setValueAt方法不';好像不行

Java JTable不';t update,调用setValueAt方法不';好像不行,java,swing,jtable,Java,Swing,Jtable,我正在创建一个数独游戏,我在使用JTables时遇到了一些麻烦。。。 我就是不能让它触发事件,因为某些原因,即使在从主类调用setValueAt时,也不会发生任何事情。但在模型内部执行时,它确实起作用。。。 正如您所看到的,我尝试了tableModelListener,但这也不起作用 总结一下我的问题:为什么我的表没有激发事件,而setValuesAt方法没有做任何事情 抽象模型: import java.awt.event.ActionEvent; import javax.swing.Ab

我正在创建一个数独游戏,我在使用JTables时遇到了一些麻烦。。。 我就是不能让它触发事件,因为某些原因,即使在从主类调用setValueAt时,也不会发生任何事情。但在模型内部执行时,它确实起作用。。。 正如您所看到的,我尝试了tableModelListener,但这也不起作用

总结一下我的问题:为什么我的表没有激发事件,而setValuesAt方法没有做任何事情

抽象模型:

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;
}