Here is the complete code :
/*
* TableModelObjec t.java
*
* Created on 22 avril 2004, 11:39
*/
package com.framework.c ontrols.table;
import java.io.InputSt ream;
import java.lang.refle ct.Field;
import java.lang.refle ct.Method;
import java.net.URL;
import java.util.Array List;
import java.util.Vecto r;
import javax.swing.tab le.AbstractTabl eModel;
import javax.xml.parse rs.DocumentBuil der;
import javax.xml.parse rs.DocumentBuil derFactory;
import org.w3c.dom.Doc ument;
import org.w3c.dom.Ele ment;
import org.w3c.dom.Nod eList;
import org.xml.sax.Ent ityResolver;
import org.xml.sax.Inp utSource;
import com.framework.m isc.fields.Colu mn;
import com.framework.m isc.stringservi ces.StringServi ces;
import com.framework.m isc.fields.IdFi eld;
/**
*
* @author Bernard Koninckx
*/
public class TableModelObjec t extends AbstractTableMo del {
private Class dataObjectClass ;
private Vector datas;
private ArrayList columns;
private IdField idField;
private Vector insertedRows;
private Vector deletedRows;
private Vector updatedRows;
/** Creates a new instance of TableModelObjec t */
public TableModelObjec t(Vector alDatas, Class cData) {
this(alDatas, cData, null);
}
public TableModelObjec t(Vector alDatas, Class cData, URL aURL) {
URL url;
insertedRows = new Vector();
deletedRows = new Vector();
updatedRows = new Vector();
if (alDatas == null) datas = new Vector();
else datas = alDatas;
dataObjectClass = cData;
try{
InputStream in = (aURL == null) ?
cData.getResour ceAsStream(Stri ngServices.conv ertClassName(da taObjectClass) +
".xml") : aURL.openStream ();
setColumnsArray (in);
}
catch(Exception e){
e.printStackTra ce();
}
}
private void setColumnsArray (InputStream aIn){
try{
columns = new ArrayList();
DocumentBuilder Factory factory =
DocumentBuilder Factory.newInst ance();
factory.setIgno ringComments(tr ue);
factory.setCoal escing(true);
factory.setName spaceAware(fals e);
factory.setVali dating(true);
DocumentBuilder parser = factory.newDocu mentBuilder();
parser.setEntit yResolver(new LocalEntityReso lver());
Document document = parser.parse(aI n);
NodeList fields = document.getEle mentsByTagName( "field");
for (int i = 0; i < fields.getLengt h(); i++){
Element el = (Element) fields.item(i);
Column col = new Column();
if
(el.getParentNo de().getNodeNam e().equals("col umn_identifier" )){
idField = new IdField();
idField.setColu mnName(el.getAt tribute("name") );
}
col.setColumnNa me(el.getAttrib ute("name"));
col.setColumnTi tle(el.getAttri bute("column_na me"));
columns.add(col );
}
}
catch(Exception e){
e.printStackTra ce();
}
}
private Field findField(Class classType, String asFieldName) throws
NullPointerExce ption {
if (classType == null) { throw new
java.lang.NullP ointerException ("Cannot find field in ancestor class"); }
try{
return classType.getDe claredField(asF ieldName);
}
catch(Exception e){
return findField(class Type.getSupercl ass(), asFieldName);
}
}
private void invokeMethod(Ob ject oData, Object oValue, String
methodName, Class className[]) throws
java.lang.Illeg alAccessExcepti on,
java.lang.Illeg alArgumentExcep tion,
java.lang.refle ct.InvocationTa rgetException,
java.lang.NoSuc hMethodExceptio n {
Method m;
try{
m = oData.getClass( ).getMethod(met hodName, className);
Object oValues[] = new Object[1];
oValues[0] = oValue;
m.invoke(oData, oValues);
}
catch(Exception e){
Class newClassName[] = new Class[1];
if (className[0].toString().end sWith("Boolean" )) newClassName[0]
= Boolean.TYPE;
if (className[0].toString().end sWith("Byte")) newClassName[0] =
Byte.TYPE;
if (className[0].toString().end sWith("Short")) newClassName[0] =
Short.TYPE;
if (className[0].toString().end sWith("Characte r"))
newClassName[0] = Character.TYPE;
if (className[0].toString().end sWith("Integer" )) newClassName[0]
= Integer.TYPE;
if (className[0].toString().end sWith("Long")) newClassName[0] =
Long.TYPE;
if (className[0].toString().end sWith("Float")) newClassName[0] =
Float.TYPE;
if (className[0].toString().end sWith("Double") ) newClassName[0]
= Double.TYPE;
m = oData.getClass( ).getMethod(met hodName, newClassName);
Object oValues[] = new Object[1];
oValues[0] = oValue;
m.invoke(oData, oValues);
}
}
public Class getColumnClass( int columnIndex) {
if (getRowCount()> 1)
return getValueAt(0,co lumnIndex).getC lass();
return null;
}
public int getColumnCount( ) {
return columns.size();
}
public String getColumnName(i nt row){
Column col = (Column)columns .get(row);
return col.getColumnTi tle();
}
public int getRowCount() {
return datas.size();
}
public Object getValueAt(int row, int col) {
Object dataObject = datas.get(row);
Column colInfo = (Column)columns .get(col);
String columnName =
StringServices. capitalize(colI nfo.getColumnNa me());
try{
Method method = dataObjectClass .getMethod("get " + columnName,
null);
return method.invoke(d ataObject, null);
}
catch(Exception e){
e.printStackTra ce();
return null;
}
}
public void setValueAt(Obje ct aValue, int row, int col){
Object oData = datas.get(row);
Column colInfo = (Column) columns.get(col );
String columnName =
StringServices. capitalize(colI nfo.getColumnNa me());
try {
if (!insertedRows. contains(oData) && !
updatedRows.con tains(oData)){
updatedRows.add (datas.get(row) );
}
invokeMethod(oD ata, aValue ,"set" + columnName, new Class[] {
getColumnClass( col) } );
}
catch(Exception e){
e.printStackTra ce();
}
fireTableRowsUp dated(row, row);
}
public boolean isCellEditable( int rowIndex, int columnIndex){
return true;
}
public void addRow(){
try{
Object o = dataObjectClass .newInstance();
datas.add(o);
insertedRows.ad d(datas.get(dat as.size() - 1));
fireTableRowsIn serted(datas.si ze() - 1, datas.size() - 1);
}
catch(Exception e){
e.printStackTra ce();
}
}
public void deleteRow(int rowToDelete){
try{
Object dataObject = datas.get(rowTo Delete);
String idName = idField.getColu mnName();
Method method = dataObjectClass .getMethod("get " +
StringServices. capitalize(idNa me), null);
Object o = method.invoke(d ataObject, null);
deletedRows.add (o);
datas.remove(ro wToDelete);
this.fireTableR owsDeleted(rowT oDelete, rowToDelete);
}
catch(Exception e){
e.printStackTra ce();
}
}
public Class getDataTypeClas s(){
return dataObjectClass ;
}
private class LocalEntityReso lver implements EntityResolver{
public InputSource resolveEntity(S tring publicId, String systemId){
if (publicId.equal s("-//TableModelObjec t/TableModelObjec t DTD
2.0//EN")){
try {
return new
InputSource(Tab leModelObject.c lass.getResourc eAsStream("Tabl eModelObject.dt d
"));
}
catch (Exception e) {
return null;
}
}
return new InputSource(sys temId);
}
}
}
"Bernard Koninckx" <ko************ *@excite.com> a écrit dans le message de
news: 40************* **********@news .skynet.be...
Hi everybody,
The following code (putted in a inherited object from AbstractTableMo del
object) make some errors :
public void deleteRow(int rowToDelete){
try{
Object dataObject = datas.get(rowTo Delete);
String idName = idField.getColu mnName();
Method method = dataObjectClass .getMethod("get " +
StringServices. capitalize(idNa me), null);
Object o = method.invoke(d ataObject, null);
deletedRows.add (o);
datas.remove(ro wToDelete);
fireTableRowsDe leted(rowToDele te, rowToDelete);
}
catch(Exception e){
e.printStackTra ce();
}
}
I don't understand why.
And here is the Stack trace exception
java.lang.NullP ointerException
at javax.swing.JTa ble.prepareRend erer(Unknown Source)
at javax.swing.pla f.basic.BasicTa bleUI.paintCell (Unknown Source)
at javax.swing.pla f.basic.BasicTa bleUI.paintCell s(Unknown Source)
at javax.swing.pla f.basic.BasicTa bleUI.paint(Unk nown Source)
at javax.swing.pla f.ComponentUI.u pdate(Unknown Source)
at javax.swing.JCo mponent.paintCo mponent(Unknown Source)
at javax.swing.JCo mponent.paint(U nknown Source)
at javax.swing.JCo mponent.paintCh ildren(Unknown Source)
at javax.swing.JCo mponent.paint(U nknown Source)
at javax.swing.JVi ewport.paint(Un known Source)
at javax.swing.JCo mponent.paintCh ildren(Unknown Source)
at javax.swing.JCo mponent.paint(U nknown Source)
at javax.swing.JCo mponent.paintCh ildren(Unknown Source)
at javax.swing.JCo mponent.paint(U nknown Source)
at javax.swing.JCo mponent.paintCh ildren(Unknown Source)
at javax.swing.JCo mponent.paint(U nknown Source)
at javax.swing.JLa yeredPane.paint (Unknown Source)
at javax.swing.JCo mponent.paintCh ildren(Unknown Source)
at javax.swing.JCo mponent.paintWi thOffscreenBuff er(Unknown Source)
at javax.swing.JCo mponent.paintDo ubleBuffered(Un known Source)
at javax.swing.JCo mponent.paint(U nknown Source)
at java.awt.Graphi csCallback$Pain tCallback.run(U nknown Source)
at sun.awt.SunGrap hicsCallback.ru nOneComponent(U nknown Source)
at sun.awt.SunGrap hicsCallback.ru nComponents(Unk nown Source)
at java.awt.Contai ner.paint(Unkno wn Source)
at sun.awt.Repaint Area.paint(Unkn own Source)
at sun.awt.windows .WComponentPeer .handleEvent(Un known Source)
at java.awt.Compon ent.dispatchEve ntImpl(Unknown Source)
at java.awt.Contai ner.dispatchEve ntImpl(Unknown Source)
at java.awt.Window .dispatchEventI mpl(Unknown Source)
at java.awt.Compon ent.dispatchEve nt(Unknown Source)
at java.awt.EventQ ueue.dispatchEv ent(Unknown Source)
at java.awt.EventD ispatchThread.p umpOneEventForH ierarchy(Unknow n Source)
at java.awt.EventD ispatchThread.p umpEventsForHie rarchy(Unknown Source)
at java.awt.EventD ispatchThread.p umpEvents(Unkno wn Source)
at java.awt.EventD ispatchThread.p umpEvents(Unkno wn Source)
at java.awt.EventD ispatchThread.r un(Unknown Source)
Thanks all
Bernard