2016-03-15 53 views
0

希望有一個簡單的問題,但我正在努力繼承。子類foo擴展了JTable。 TableModelListener.getSource返回JTable不是foo

最終目標是檢測單元格在JTable中何時發生更改,然後運行涉及獲取與該表關聯的額外特定屬性的操作。

我有一個擴展了JTable的類,這樣我就可以在表中添加一些額外的屬性。擴展JTable的意義在於,當TableModelListener被激活時,我可以獲得額外的屬性。

public class dataTable extends JTable implements TableModelListener{ 

private final PowerpointTable extraProperty; 

public dataTable(String[][] tableArray, String[] colNames, PowerpointTable extraProperty) { 
    super(tableArray, colNames); 
    this.extraProperty= extraProperty; 

    } 

    public PowerpointTable getExtraProperty() { 
     return this.extraProperty; 
    } 
} 

然後,我會像對待這個類像一個JTable和其他類創建表,並添加當細胞被改變的觸發聽者表。

public secondClass { 

    public secondClass() {} 

    public void createTable() { 
     dataTable newdataTable= new dataTable(tableArray, columnNames, currentTable); 
     newdataTable.getModel().addTableModelListener(new TableModelListener() { 

     @Override 
     public void tableChanged(TableModelEvent tme) { 
       PowerpointTable pptT = tme.getSource().getExtraProperty; 
     }); 
} 

但是,getSource只返回一個不能轉換爲dataTable的JTable。

請讓我知道我該如何訪問此屬性,或者是否有更好的方法來實現此功能。

+1

'PowerpointTable pptT =((數據表)tme.getSource())getExtraProperty;'只要確信'應工作newdataTable'是一個'DataTable'。小心括號。可能有更優雅的方式。 – bradimus

+0

這是我第一次嘗試的方式,但它拋出java.lang.ClassCastException – emmistar

+0

我不知道它爲什麼返回'JTable',但我檢查了源代碼'TableModelEvent'。 'getSource()'方法似乎返回'TableModel',它不是'JTable'的父類。也許你可以與我們分享關於這個事件如何發生的更多信息。 – rdonuk

回答

0

解決它,

作爲rdonuk指出的,返回的getSource一個TableModel的,

我因此改變了第一類來擴展一個DefaultTableModel和添加的額外屬性。

public class TryingTableModel extends DefaultTableModel { 

public TryingTableModel(PowerpointTable pptRef, Object[][] os, Object[] os1) { 
    super(os, os1); 
    this.pptRef = pptRef; 
} 

private final PowerpointTable pptRef; 

public PowerpointTable getPPTTable() { 
    return this.pptRef; 
} 

public String testAccess() { 
    return "it worked"; 
} 

JTable的現在初始化在第二類

TryingTableModel tableModel = new TryingTableModel(currentTable, tableArray, columnNames); 
tableModel.addTableModelListener(new TableModelListener() { 

    @Override 
    public void tableChanged(TableModelEvent tme) { 
    TryingTableModel tableModel = (TryingTableModel) tme.getSource(); 
    System.out.println(tableModel.testAccess()); 
    } 
}); 

JTable newJTable = new JTable(tableModel); 
相關問題