将数据添加为参数后,Jtable内容不会刷新

时间:2010-02-26 16:00:48

标签: java swing jtable

我有一个jtable,如果我将表数据设置为公共变量(不要将它放在tablemodel的参数上),一切正常。但是现在我需要将表数据设置为参数,表格不会刷新其内容。我打印出一些单元格值和行号,它们都更新和正确。只是显示没有改变,仍然是旧的内容。我一直在尝试所有类型的方法刷新表,包括fireTableDataChanged和repaint,以及其他fire函数,它们都不起作用。请帮忙。非常感谢!!!!!!

表模型是:

       public class MyTableModel extends AbstractTableModel {

           protected String[] columnNames;
           private String[][] data;


            public MyTableModel(String[] columnNames, String[][] data){
                this.columnNames = columnNames;
                this.data = data;
                //I add this here but it still doesn't refresh the table
                fireTableDataChanged();
            }

            public int getColumnCount() {
                return columnNames.length;
            }

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

            public String getColumnName(int col) {
                return columnNames[col];
            }

            public String getValueAt(int row, int col) {
                return data[row][col];                  
            }

           public void setData(String[][] newdata) {   
              data = newdata;

              fireTableDataChanged();   
              }  
        }

我更新表模型和表的代码是:

        tableModel=new MyTableModel(columnNames, data);
        tableModel.fireTableDataChanged();
        table = new JTable();
        table.setModel(tableModel); 
        ((AbstractTableModel) table.getModel()).fireTableDataChanged();
        //outputs showed the content is updated
        System.out.println("total row count" + table.getRowCount());
        System.out.println("cell info" + table.getValueAt(0,5));


        table.repaint();
        feedback.repaint();
        this.repaint();

2 个答案:

答案 0 :(得分:8)

你不应该重新分配你的桌子:

 tableModel=new MyTableModel(columnNames, data);
 tableModel.fireTableDataChanged(); // not necessary
 table = new JTable(); // dont do this, you are removing your handle to the table in your view
 table.setModel(tableModel); 

答案 1 :(得分:1)

我将Model数据设为静态,因为它的工作正常。我不关心这部分的OOPS ..

/******************Its a custom class for creating custom editors so plz comment unwanted code ********************************/

@SuppressWarnings("serial")
class MyTableModel extends AbstractTableModel 
{
    protected String[] columnNames = {"URL",
                                    "Category",
                                    "Select"};
    protected static Object data [][] = null;

    public MyTableModel() { 
     }

    public final Object[] longValues = {"http://www.oracle.com", "BOOK", Boolean.TRUE};

    public int getColumnCount() {
        return columnNames.length;
    }

    public int getRowCount() {

        if(data !=null)
            return data.length;
        else
            return 0;
    }

    public String getColumnName(int col) {
        return columnNames[col];
    }

    public Object getValueAt(int row, int col) {

        if(data!=null)
            return data[row][col];
        else
            return null;
    }

    /*
     * JTable uses this method to determine the default renderer/
     * editor for each cell.  If we didn't implement this method,
     * then the last column would contain text ("true"/"false"),
     * rather than a check box.
     */
    public Class getColumnClass(int c) {
        return getValueAt(0, c).getClass();
    }

    /*
     * Don't need to implement this method unless your table's
     * editable.
     */
    public boolean isCellEditable(int row, int col) {
        //Note that the data/cell address is constant,
        //no matter where the cell appears onscreen.
        if (col < 0) {
            return false;
        } else {
            return true;
        }
    }

    /*
     * Don't need to implement this method unless your table's
     * data can change.
     */
    public void setValueAt(Object value, int row, int col) 
    {

        data[row][col] = value;
        fireTableCellUpdated(row, col);
        // printDebugData();
    }

    private void printDebugData() {
        int numRows = getRowCount();
        int numCols = getColumnCount();

        for (int i=0; i < numRows; i++) {
            System.out.print("    row " + i + ":");
            for (int j=0; j < numCols; j++) {
                System.out.print("  " + data[i][j]);
            }
            System.out.println();
        }
        System.out.println("--------------------------");
    }
}

/***********************************/
//Use a Jbutton add a listener and put this code in it to test it works !!

Object d [][] = {
                {"http://www.abc.com", "ABC", new Boolean(false)},
                {"http://www.google.com", "DEF", new Boolean(true)},
                {"http://www.yahoo.com", "FGH", new Boolean(false)},
                {"http://www.google.com", "IJK", new Boolean(true)},
                {"http://www.yahoo.com", "LMN", new Boolean(false)}
            };

        model.data = d; //Important to update data
        model.fireTableDataChanged(); //Important to make changes reflected.
/*********************************************/