2014-10-18 37 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