OVH Cloud OVH Cloud

Errreur de suppression de row dans une JTable

2 réponses
Avatar
Bernard Koninckx
Bonjour à tous,

Le code suivant provoque une erreur :
public void deleteRow(int rowToDelete){
try{
Object dataObject = datas.get(rowToDelete);
String idName = idField.getColumnName();
Method method = dataObjectClass.getMethod("get" +
StringServices.capitalize(idName), null);
Object o = method.invoke(dataObject, null);
deletedRows.add(o);
datas.remove(rowToDelete);
fireTableRowsDeleted(rowToDelete, rowToDelete);
}
catch(Exception e){
e.printStackTrace();
}
}

et je ne comprend vraiment pas pourquoi.

Et voici la pile d'erreurs générée par Java

java.lang.NullPointerException
at javax.swing.JTable.prepareRenderer(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paintCell(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paintCells(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paint(Unknown Source)
at javax.swing.plaf.ComponentUI.update(Unknown Source)
at javax.swing.JComponent.paintComponent(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JViewport.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JLayeredPane.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paintWithOffscreenBuffer(Unknown Source)
at javax.swing.JComponent.paintDoubleBuffered(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at java.awt.GraphicsCallback$PaintCallback.run(Unknown Source)
at sun.awt.SunGraphicsCallback.runOneComponent(Unknown Source)
at sun.awt.SunGraphicsCallback.runComponents(Unknown Source)
at java.awt.Container.paint(Unknown Source)
at sun.awt.RepaintArea.paint(Unknown Source)
at sun.awt.windows.WComponentPeer.handleEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

Merci à tous pour vos éclairement, remarques, ....

Bernard

2 réponses

Avatar
Bernard Koninckx
La même erreur trace d'erreur apparaît quand j'essaie d'ajouter une ligne à
un JTable quand il est vide.

public void addRow(){
try{
Object o = dataObjectClass.newInstance();
datas.add(o);
insertedRows.add(datas.get(datas.size() - 1));
fireTableRowsInserted(datas.size() - 1, datas.size() - 1);
}
catch(Exception e){
e.printStackTrace();
}
}

java.lang.NullPointerException
at javax.swing.JTable.prepareRenderer(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paintCell(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paintCells(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paint(Unknown Source)
at javax.swing.plaf.ComponentUI.update(Unknown Source)
at javax.swing.JComponent.paintComponent(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JViewport.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JLayeredPane.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paintWithOffscreenBuffer(Unknown Source)
at javax.swing.JComponent.paintDoubleBuffered(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at java.awt.GraphicsCallback$PaintCallback.run(Unknown Source)
at sun.awt.SunGraphicsCallback.runOneComponent(Unknown Source)
at sun.awt.SunGraphicsCallback.runComponents(Unknown Source)
at java.awt.Container.paint(Unknown Source)
at sun.awt.RepaintArea.paint(Unknown Source)
at sun.awt.windows.WComponentPeer.handleEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

Bernard

"Bernard Koninckx" a écrit dans le message de
news: 40926111$0$21677$
Bonjour à tous,

Le code suivant provoque une erreur :
public void deleteRow(int rowToDelete){
try{
Object dataObject = datas.get(rowToDelete);
String idName = idField.getColumnName();
Method method = dataObjectClass.getMethod("get" +
StringServices.capitalize(idName), null);
Object o = method.invoke(dataObject, null);
deletedRows.add(o);
datas.remove(rowToDelete);
fireTableRowsDeleted(rowToDelete, rowToDelete);
}
catch(Exception e){
e.printStackTrace();
}
}

et je ne comprend vraiment pas pourquoi.

Et voici la pile d'erreurs générée par Java

java.lang.NullPointerException
at javax.swing.JTable.prepareRenderer(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paintCell(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paintCells(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paint(Unknown Source)
at javax.swing.plaf.ComponentUI.update(Unknown Source)
at javax.swing.JComponent.paintComponent(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JViewport.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JLayeredPane.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paintWithOffscreenBuffer(Unknown Source)
at javax.swing.JComponent.paintDoubleBuffered(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at java.awt.GraphicsCallback$PaintCallback.run(Unknown Source)
at sun.awt.SunGraphicsCallback.runOneComponent(Unknown Source)
at sun.awt.SunGraphicsCallback.runComponents(Unknown Source)
at java.awt.Container.paint(Unknown Source)
at sun.awt.RepaintArea.paint(Unknown Source)
at sun.awt.windows.WComponentPeer.handleEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

Merci à tous pour vos éclairement, remarques, ....

Bernard




Avatar
Bernard Koninckx
Voici le code complet, si nécessaire :

/*
* TableModelObject.java
*
* Created on 22 avril 2004, 11:39
*/

package com.framework.controls.table;

import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.URL;
import java.util.ArrayList;
import java.util.Vector;

import javax.swing.table.AbstractTableModel;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;

import com.framework.misc.fields.Column;
import com.framework.misc.stringservices.StringServices;
import com.framework.misc.fields.IdField;

/**
*
* @author Bernard Koninckx
*/
public class TableModelObject extends AbstractTableModel {
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 TableModelObject */
public TableModelObject(Vector alDatas, Class cData) {
this(alDatas, cData, null);
}

public TableModelObject(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.getResourceAsStream(StringServices.convertClassName(dataObjectClass) +
".xml") : aURL.openStream();
setColumnsArray(in);
}
catch(Exception e){
e.printStackTrace();
}
}

private void setColumnsArray(InputStream aIn){
try{
columns = new ArrayList();

DocumentBuilderFactory factory DocumentBuilderFactory.newInstance();
factory.setIgnoringComments(true);
factory.setCoalescing(true);
factory.setNamespaceAware(false);
factory.setValidating(true);

DocumentBuilder parser = factory.newDocumentBuilder();
parser.setEntityResolver(new LocalEntityResolver());
Document document = parser.parse(aIn);

NodeList fields = document.getElementsByTagName("field");

for (int i = 0; i < fields.getLength(); i++){
Element el = (Element) fields.item(i);
Column col = new Column();
if
(el.getParentNode().getNodeName().equals("column_identifier")){
idField = new IdField();
idField.setColumnName(el.getAttribute("name"));
}
col.setColumnName(el.getAttribute("name"));
col.setColumnTitle(el.getAttribute("column_name"));
columns.add(col);
}
}
catch(Exception e){
e.printStackTrace();
}
}

private Field findField(Class classType, String asFieldName) throws
NullPointerException {
if (classType == null) { throw new
java.lang.NullPointerException("Cannot find field in ancestor class"); }
try{
return classType.getDeclaredField(asFieldName);
}
catch(Exception e){
return findField(classType.getSuperclass(), asFieldName);
}
}

private void invokeMethod(Object oData, Object oValue, String
methodName, Class className[]) throws
java.lang.IllegalAccessException,
java.lang.IllegalArgumentException,
java.lang.reflect.InvocationTargetException,
java.lang.NoSuchMethodException {

Method m;

try{
m = oData.getClass().getMethod(methodName, 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().endsWith("Boolean")) newClassName[0]
= Boolean.TYPE;
if (className[0].toString().endsWith("Byte")) newClassName[0] Byte.TYPE;
if (className[0].toString().endsWith("Short")) newClassName[0] Short.TYPE;
if (className[0].toString().endsWith("Character"))
newClassName[0] = Character.TYPE;
if (className[0].toString().endsWith("Integer")) newClassName[0]
= Integer.TYPE;
if (className[0].toString().endsWith("Long")) newClassName[0] Long.TYPE;
if (className[0].toString().endsWith("Float")) newClassName[0] Float.TYPE;
if (className[0].toString().endsWith("Double")) newClassName[0]
= Double.TYPE;

m = oData.getClass().getMethod(methodName, newClassName);
Object oValues[] = new Object[1];
oValues[0] = oValue;
m.invoke(oData, oValues);
}
}

public Class getColumnClass(int columnIndex) {
if (getRowCount()>1)
return getValueAt(0,columnIndex).getClass();
return null;
}

public int getColumnCount() {
return columns.size();
}

public String getColumnName(int row){
Column col = (Column)columns.get(row);
return col.getColumnTitle();
}

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(colInfo.getColumnName());
try{
Method method = dataObjectClass.getMethod("get" + columnName,
null);
return method.invoke(dataObject, null);
}
catch(Exception e){
e.printStackTrace();
return null;
}
}

public void setValueAt(Object aValue, int row, int col){
Object oData = datas.get(row);
Column colInfo = (Column) columns.get(col);
String columnName StringServices.capitalize(colInfo.getColumnName());

try {
if (!insertedRows.contains(oData) && !
updatedRows.contains(oData)){
updatedRows.add(datas.get(row));
}
invokeMethod(oData, aValue ,"set" + columnName, new Class[] {
getColumnClass(col) } );
}
catch(Exception e){
e.printStackTrace();
}
fireTableRowsUpdated(row, row);
}

public boolean isCellEditable(int rowIndex, int columnIndex){
return true;
}

public void addRow(){
try{
Object o = dataObjectClass.newInstance();
datas.add(o);
insertedRows.add(datas.get(datas.size() - 1));
fireTableRowsInserted(datas.size() - 1, datas.size() - 1);
}
catch(Exception e){
e.printStackTrace();
}
}

public void deleteRow(int rowToDelete){
try{
Object dataObject = datas.get(rowToDelete);
String idName = idField.getColumnName();
Method method = dataObjectClass.getMethod("get" +
StringServices.capitalize(idName), null);
Object o = method.invoke(dataObject, null);
deletedRows.add(o);
datas.remove(rowToDelete);
this.fireTableRowsDeleted(rowToDelete, rowToDelete);
}
catch(Exception e){
e.printStackTrace();
}
}

public Class getDataTypeClass(){
return dataObjectClass;
}

private class LocalEntityResolver implements EntityResolver{
public InputSource resolveEntity(String publicId, String systemId){
if (publicId.equals("-//TableModelObject/TableModelObject DTD
2.0//EN")){
try {
return new
InputSource(TableModelObject.class.getResourceAsStream("TableModelObject.dtd
"));
}
catch (Exception e) {
return null;
}
}
return new InputSource(systemId);
}
}
}

Bernard



"Bernard Koninckx" a écrit dans le message de
news: 40926111$0$21677$
Bonjour à tous,

Le code suivant provoque une erreur :
public void deleteRow(int rowToDelete){
try{
Object dataObject = datas.get(rowToDelete);
String idName = idField.getColumnName();
Method method = dataObjectClass.getMethod("get" +
StringServices.capitalize(idName), null);
Object o = method.invoke(dataObject, null);
deletedRows.add(o);
datas.remove(rowToDelete);
fireTableRowsDeleted(rowToDelete, rowToDelete);
}
catch(Exception e){
e.printStackTrace();
}
}

et je ne comprend vraiment pas pourquoi.

Et voici la pile d'erreurs générée par Java

java.lang.NullPointerException
at javax.swing.JTable.prepareRenderer(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paintCell(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paintCells(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paint(Unknown Source)
at javax.swing.plaf.ComponentUI.update(Unknown Source)
at javax.swing.JComponent.paintComponent(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JViewport.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JLayeredPane.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paintWithOffscreenBuffer(Unknown Source)
at javax.swing.JComponent.paintDoubleBuffered(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at java.awt.GraphicsCallback$PaintCallback.run(Unknown Source)
at sun.awt.SunGraphicsCallback.runOneComponent(Unknown Source)
at sun.awt.SunGraphicsCallback.runComponents(Unknown Source)
at java.awt.Container.paint(Unknown Source)
at sun.awt.RepaintArea.paint(Unknown Source)
at sun.awt.windows.WComponentPeer.handleEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

Merci à tous pour vos éclairement, remarques, ....

Bernard