2014-10-18 57 views
2

我想在每次单击标题时使用setValueAt方法在我的jtablemodel中设置一个值。我目前有一个MouseAdapter正确显示哪个列被点击,但board.setValueAt()方法没有被调用。AbstractTableModel 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); 
    } 
} 

TableModel的。 “输入时的设定值”永远不会显示到控制台。当我尝试覆盖它时,它给了我一个错误。

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

谁能告诉我什么,我做错了什么?

+0

你为什么要创建一个自定义TableModel。你没有添加任何特殊的功能,所以你应该可以使用'DefaultTableModel'。另外,不要调用你的类TableModel,它是接口名称,所以它很混乱。类名应该更具描述性。 – camickr 2014-10-18 17:34:44

回答

5

您的setValueAt方法签名与AbstractTableModel的签名不匹配,因此不会覆盖超级自己的方法。第一个参数应该是Object,而不是Data。重写方法时始终使用@Override注释,以便编译器检查并确保您正确地执行此操作。

+2

+1好... – camickr 2014-10-18 17:33:32

+0

@camickr:谢谢! – 2014-10-18 17:34:00

+0

谢谢你,这就是它。我将它作为Object data2并将其转换为方法中的(Data)。现在我可以执行覆盖。我没有意识到我必须使用Object来代替。 – Chad 2014-10-18 17:34:55