Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java AbstractTableModel setValueAt方法未被调用_Java_Swing_Jtable_Mouselistener_Abstracttablemodel - Fatal编程技术网

Java AbstractTableModel setValueAt方法未被调用

Java AbstractTableModel setValueAt方法未被调用,java,swing,jtable,mouselistener,abstracttablemodel,Java,Swing,Jtable,Mouselistener,Abstracttablemodel,每当单击标题时,我都试图使用setValueAt方法在jtablemodel中设置一个值。我目前有一个MouseAdapter,它可以正确显示正在单击的列,但是没有调用board.setValueAt()方法 鼠标侦听器。这将正确显示我单击的列。我尝试过使用board.getModel().setValueAt(),但也不起作用 public class HeaderListener extends MouseAdapter{ private JTable board; publ

每当单击标题时,我都试图使用setValueAt方法在jtablemodel中设置一个值。我目前有一个MouseAdapter,它可以正确显示正在单击的列,但是没有调用board.setValueAt()方法

鼠标侦听器。这将正确显示我单击的列。我尝试过使用board.getModel().setValueAt(),但也不起作用

public class HeaderListener extends MouseAdapter{
    private JTable board;
    public HeaderListener(JTable board){
        this.board = board;
    }

    @Override
    public void mouseClicked(MouseEvent event) {
        Point point = event.getPoint();
        int column = board.columnAtPoint(point);
        System.out.println(column);
        Data value = new Data(0,"yes");
        board.setValueAt(value, 0, column);
    }
}
表格模型。“输入时的设置值”永远不会显示在控制台上。当我试图覆盖它时,它会给我一个错误

public class TableModel extends AbstractTableModel{
    private Data[][] data; 
    private String[] columnNames = {"Move Here",
                        "Move Here",
                        "Move Here",
                        "Move Here",
                        "Move Here","Move Here"};

    public TableModel(){
        data = new Data[6][7];
        Data test = new Data(0,"yes");
        data[1][1] = test;
    }

    @Override
    public int getRowCount() {
        return data.length;
    }

    @Override
    public int getColumnCount() {
        return columnNames.length;
    }
    @Override
    public String getColumnName(int col) {
        return columnNames[col];
    }
    @Override
    public Object getValueAt(int row, int col) {
        return (data[row][col]==null?"":data[row][col].getText());
    }

    public void setValueAt(Data data2, int row, int col){
        System.out.println("Set value at entered");
        data[row][col] = data2;
        fireTableCellUpdated(row,col);
        System.out.println(data[row][col].getText());
        System.out.println(data[row][col].getPlayer());
    }

}
主方法板创建…

JTable board = new JTable(new TableModel());
board.getTableHeader().addMouseListener(new HeaderListener(board));

有人能告诉我我做错了什么吗?

您的setValueAt方法签名与AbstractTableModel的签名不匹配,因此不会覆盖super自己的方法。第一个参数应该是对象,而不是数据。重写方法时,请始终使用
@Override
注释,以允许编译器检查以确保您的操作正确。

为什么要创建自定义TableModel。您没有添加任何特殊功能,因此应该能够使用
DefaultTableModel
。另外,不要调用类TableModel,因为它是接口名,所以很容易混淆。类名应该更具描述性。谢谢,就是这样。我将其设置为对象data2,并将其转换为方法中的(Data)。现在我可以做超控了。我没有意识到我必须用Object来代替。@Chad:这就是为什么
@Override
如此重要的原因。您不必意识到这一点,但有了注释,编译器会通知您这是不对的。@Chad,
这就是@Override如此重要的原因。
它还说明了为什么在编码时保持一致性很重要。所有其他方法都使用@Override注释。不确保所有方法都使用它是草率的/懒惰的。我知道它应该是@Override,但我不明白为什么它会给我一个错误,建议我删除它。现在我知道你不能改变参数类型。