我以前做的一个例子,取回数据在jtable显示,可以动态刷新,增加删除。
//定义
ParaInfoModel analogModel=new ParaInfoModel();
jTable jAnalogTable = new JTable(analogModel);//变化
analogModel.updatePara(tempPara);//扩展AbstractTableModel,加自己的方法
class ParaInfoModel extends AbstractTableModel {
protected int NUM_COLUMNS = 3;
protected int START_NUM_ROWS = 0;
protected int nextEmptyRow = 0;
protected int numRows = 0; static final public String paraName = "参数名称";
static final public String statusName = "参数状态";
static final public String valueName = "参数值"; protected Vector data = null; public ParaInfoModel() {
data = new Vector();
} public String getColumnName(int column) {
switch (column) {
case 0:
return paraName;
case 1:
return statusName;
case 2:
return valueName;
}
return "";
} //XXX Should this really be synchronized?
public synchronized int getColumnCount() {
return NUM_COLUMNS;
} public synchronized int getRowCount() {
if (numRows < START_NUM_ROWS) {
return START_NUM_ROWS;
} else {
return numRows;
}
} public synchronized Object getValueAt(int row, int column) {
try {
WebJkPara p = (WebJkPara)data.elementAt(row);
switch (column) {
case 0:
return p.dname;
case 1:
return p.status;
case 2:
return p.value;
}
} catch (Exception e) {
}
return "";
}
public synchronized void updatePara(WebJkPara paraRecord) {
int ID = paraRecord.itemNumber; //find the ID
int index = -1;
boolean found = false;
boolean addedRow = false; if (ID!=0){
found = true;
index = ID - 1;
} if (found) { //update old player
data.setElementAt(paraRecord, index);
} else { //add new player
if (numRows <= nextEmptyRow) {
//add a row
numRows++;
addedRow = true;
}
index = nextEmptyRow;
data.addElement(paraRecord);
} nextEmptyRow++; //Notify listeners that the data changed.
if (addedRow) {
fireTableRowsInserted(index, index);
} else {
fireTableRowsUpdated(index, index);
}
} public synchronized void clear() {
int oldNumRows = numRows;
numRows = START_NUM_ROWS;
data.removeAllElements();
nextEmptyRow = 0; if (oldNumRows > START_NUM_ROWS) {
fireTableRowsDeleted(START_NUM_ROWS, oldNumRows - 1);
}
fireTableRowsUpdated(0, START_NUM_ROWS - 1);
}
}
//定义
ParaInfoModel analogModel=new ParaInfoModel();
jTable jAnalogTable = new JTable(analogModel);//变化
analogModel.updatePara(tempPara);//扩展AbstractTableModel,加自己的方法
class ParaInfoModel extends AbstractTableModel {
protected int NUM_COLUMNS = 3;
protected int START_NUM_ROWS = 0;
protected int nextEmptyRow = 0;
protected int numRows = 0; static final public String paraName = "参数名称";
static final public String statusName = "参数状态";
static final public String valueName = "参数值"; protected Vector data = null; public ParaInfoModel() {
data = new Vector();
} public String getColumnName(int column) {
switch (column) {
case 0:
return paraName;
case 1:
return statusName;
case 2:
return valueName;
}
return "";
} //XXX Should this really be synchronized?
public synchronized int getColumnCount() {
return NUM_COLUMNS;
} public synchronized int getRowCount() {
if (numRows < START_NUM_ROWS) {
return START_NUM_ROWS;
} else {
return numRows;
}
} public synchronized Object getValueAt(int row, int column) {
try {
WebJkPara p = (WebJkPara)data.elementAt(row);
switch (column) {
case 0:
return p.dname;
case 1:
return p.status;
case 2:
return p.value;
}
} catch (Exception e) {
}
return "";
}
public synchronized void updatePara(WebJkPara paraRecord) {
int ID = paraRecord.itemNumber; //find the ID
int index = -1;
boolean found = false;
boolean addedRow = false; if (ID!=0){
found = true;
index = ID - 1;
} if (found) { //update old player
data.setElementAt(paraRecord, index);
} else { //add new player
if (numRows <= nextEmptyRow) {
//add a row
numRows++;
addedRow = true;
}
index = nextEmptyRow;
data.addElement(paraRecord);
} nextEmptyRow++; //Notify listeners that the data changed.
if (addedRow) {
fireTableRowsInserted(index, index);
} else {
fireTableRowsUpdated(index, index);
}
} public synchronized void clear() {
int oldNumRows = numRows;
numRows = START_NUM_ROWS;
data.removeAllElements();
nextEmptyRow = 0; if (oldNumRows > START_NUM_ROWS) {
fireTableRowsDeleted(START_NUM_ROWS, oldNumRows - 1);
}
fireTableRowsUpdated(0, START_NUM_ROWS - 1);
}
}
jtable一般只能放object,你可以将其转换为相应的对象类型即可。
所以呢 ... 看看dx和dbswing的源代码,试着定制一个小点的吧 :)
--
另外,还想请教大家,如果纯粹的是借助jdbc和jtable来做,在后台保持一个(或多个?)和数据库同步的线程是好办法吗(有其它的建议吗)?还有就是jtable里我虽然可以知道一个单元的内容是否被动过,可是怎么才能进一步得到具体信息?比如这个单元的内容从A变到了B?