我有一个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();
答案 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.
/*********************************************/