自己写了个tableModel,但是fireTableXXX相关的函数用不来,按照DefaultTableModel的源码来模仿也不行。请高手来指点一下。

解决方案 »

  1.   

    晕,写不来就不要写了呗,AbstractTableModel的fireTableXXX的方法又不是抽象方法,不是必须得实现,AbstractTableModel里面已经有一套实现机制了,还费那么多心思干嘛?而且TableModel这个接口也没有约定要实现fireTableXXX方法。fire...这种触发事件的方法不是谁都能写的,像MouseClick这种,你怎么可能知道怎么判断是否点击鼠标了嘛,很多都是本地代码相关的,要和系统交互才能知道的,JVM里面有专门的监听线程负责。其实一般来说,fireXXX方法的实现也就是生成一个特定的Event对象,然后遍历一下监听器集合,把Event对象作为参数传递给每个监听器调用的方法特定方法。
      

  2.   

    package tableModel;import java.util.Arrays;
    import java.util.Map;import javax.swing.event.TableModelEvent;
    import javax.swing.event.TableModelListener;
    import javax.swing.table.AbstractTableModel;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.table.TableModel;public class CustomizeTableModel extends AbstractTableModel {
    private String[][] data;
    private String[] columnNames;


    public CustomizeTableModel(String[][] data,String[] columnNames) {
    super();
    this.data = data;
    this.columnNames = columnNames;

    } @Override
    public Class<?> getColumnClass(int columnIndex) {
    // TODO Auto-generated method stub
    return String.class;
    } @Override
    public int getColumnCount() {
    // TODO Auto-generated method stub

    return columnNames.length;

    } @Override
    public String getColumnName(int columnIndex) {
    // TODO Auto-generated method stub

    return columnNames[columnIndex];
    } @Override
    public int getRowCount() {
    // TODO Auto-generated method stub
    return data.length;
    } @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
    // TODO Auto-generated method stub
    return data[rowIndex][columnIndex];
    } @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
    // TODO Auto-generated method stub
    return true;
    } @Override
    public void setValueAt(Object value, int rowIndex, int columnIndex) {
    // TODO Auto-generated method stub

    if (value instanceof String){
    String s = (String)value;
    data[rowIndex][columnIndex] = s;
    }
    } public void addColumn(String columnName,String[] columnData){
    if (columnData == null){
    columnData = new String[data.length];
    for(int i = 0 ; i < columnData.length;i++){
    columnData[i] = "";
    }
    }
    if (columnData.length < columnNames.length){
    String[] newColumnData = Arrays.copyOf(columnData, columnData.length + 1);
    columnData = newColumnData;
    }
    String[] newColumnName = new String[columnNames.length + 1];
    for(int i = 0;i < newColumnName.length;i++){
    if (i == columnNames.length){
    newColumnName[i] = columnName;
    }else{
    newColumnName[i] = columnNames[i];
    }
    }

    this.columnNames = newColumnName;

    String[][] newData = new String[data.length][data[0].length + 1];
    for (int i = 0;i < newData.length;i++){
    for(int j = 0 ; j < newData[0].length;j++){
    if (j < data[0].length){
    newData[i][j] = data[i][j];
    }else{
    if (columnData[i] == null)
    columnData[i] = "";
    newData[i][j] = columnData[i];
    }
    }
    }

    this.data = newData;
    }

    public void addColumn(String columnName){
    this.addColumn(columnName, null);
    }

    public void addRow(String[] rowData){
    String[][] newData = new String[data.length + 1][data[0].length];
    for (int i = 0; i < newData.length;i++){
    for (int j = 0; j < newData[0].length ;j++){
    if (i < data.length){
    newData[i][j] = data[i][j];
    }else{
    if(rowData[j] == null)
    rowData[j] = "";
    newData[i][j] = rowData[j];
    }
    }
    }
    this.data = newData;

    fireTableRowsInserted(0, data.length - 1);
    }

    public void removeRow(int row){
    if (row < 0 || row >= data.length)
    return;
    String[][] newData = new String[data.length - 1][data[0].length];
    for (int i = 0; i < newData.length;i++){
    for (int j = 0; j < newData[0].length;j++){
    if (i < row){
    newData[i][j] = data[i][j];
    }else{
    newData[i][j] = data[i + 1][j];
    }
    }
    }

    this.data = newData;
    System.out.println("====fireTableRowsDeleted======");
    fireTableRowsDeleted(row, row);
    }

    public void insertRow(int row,String[] rowData){
    String[][] newData = new String[data.length + 1][data[0].length];
    for (int i = 0 ; i < newData.length;i++){
    for (int j = 0 ; j < newData[0].length;j++){
    if (i == row){
    if (rowData[j] == null)
    rowData[j] = "";
    newData[i][j] = rowData[j];
    }else if (i > row){
    newData[i][j] = data[i - 1][j];
    }else{
    newData[i][j] = data[i][j];
    }
    }
    }
    this.data = newData;
    fireTableRowsInserted(0, data.length - 1);
    }

    public void setColumnIdentifiers(String[] columnIdentifiers){
    for (int i = 0 ; i < columnIdentifiers.length;i++){
    if (columnIdentifiers[i] == null)
    columnIdentifiers[i] = "";
    }
    this.columnNames = columnIdentifiers;
    }

    public void setDataVector(String[][] dataVector,String[] columnIdentifiers){

    this.data = dataVector;
    this.columnNames = columnIdentifiers;
    }

    public int findColumn(String columnName){
    for (int i = 0; i < columnNames.length;i++){
    if (columnNames[i].equals(columnName)){
    return i;
    }
    }
    return -1;
    }

    public static void main(String...strings){
    String[][] data = new String[][]{{"key1","USA","美国"},{"key2","Japan","日本"}
    ,{"key3","China","中国"}};
    String[] columnNames = new String[]{"KEY","_en_US","_zh_CN"};

    CustomizeTableModel tableModel = new CustomizeTableModel(data,columnNames);


    //=====================================================================================
    for (int i = 0;i < tableModel.getColumnCount();i++){
    System.out.print(tableModel.getColumnName(i) + "::");
    }
    System.out.println();
    System.out.println("--------------------");

    for (int i = 0 ; i < tableModel.getRowCount();i++){
    for (int j = 0; j < tableModel.getColumnCount();j++){
    System.out.print(tableModel.getValueAt(i, j) + "::");
    }
    System.out.println();
    }
    }
    }执行fireTableRowsDeleted(row, row);报错
      

  3.   

    没有看明白你的意思,什么叫做用不来?
    还有你的这段代码,究竟是想要做什么呢?fireXXX函数系是发送触发事件的信息的。例如,fireTableDataChanged会通知对应的table,model的数据发生了变化需要重新装载数据来刷新显示。
    而这些,abstractTableModel都已经有了实现。你现在是想要做些什么呢?