java - ArrayIndexOutOfBoundsException while adding row to datamodel -
i apologize asking question that's been asked lot in various forms, have yet find complete answer works. i'm trying append row tablemodel. i've tried doing in lot of different ways run similar issues (or new , exciting ones). anyway, when try add row "arrayindexoutofboundsexception" error. i've marked line error occurs in code below. i've included errors i've seen , debugging output i've been using. i'm aware don't need extend defaulttablemodel see here, stripped down version i've been working chase bug.
exception:
exception in thread "awt-eventqueue-0" java.lang.arrayindexoutofboundsexception: 2 > 0 @ java.util.vector.insertelementat(vector.java:594) @ javax.swing.table.defaulttablemodel.insertrow(defaulttablemodel.java:374) @ javax.swing.table.defaulttablemodel.addrow(defaulttablemodel.java:350) @ javax.swing.table.defaulttablemodel.addrow(defaulttablemodel.java:361) @ smc.rolecard$1.actionperformed(rolecard.java:69) @ javax.swing.abstractbutton.fireactionperformed(abstractbutton.java:2018) @ javax.swing.abstractbutton$handler.actionperformed(abstractbutton.java:2341) @ javax.swing.defaultbuttonmodel.fireactionperformed(defaultbuttonmodel.java:402) @ javax.swing.defaultbuttonmodel.setpressed(defaultbuttonmodel.java:259) @ javax.swing.plaf.basic.basicbuttonlistener.mousereleased(basicbuttonlistener.java:252) @ java.awt.component.processmouseevent(component.java:6505) @ javax.swing.jcomponent.processmouseevent(jcomponent.java:3321) @ java.awt.component.processevent(component.java:6270) @ java.awt.container.processevent(container.java:2229) @ java.awt.component.dispatcheventimpl(component.java:4861) @ java.awt.container.dispatcheventimpl(container.java:2287) @ java.awt.component.dispatchevent(component.java:4687) @ java.awt.lightweightdispatcher.retargetmouseevent(container.java:4832) @ java.awt.lightweightdispatcher.processmouseevent(container.java:4492) @ java.awt.lightweightdispatcher.dispatchevent(container.java:4422) @ java.awt.container.dispatcheventimpl(container.java:2273) @ java.awt.window.dispatcheventimpl(window.java:2719) @ java.awt.component.dispatchevent(component.java:4687) @ java.awt.eventqueue.dispatcheventimpl(eventqueue.java:729) @ java.awt.eventqueue.access$200(eventqueue.java:103) @ java.awt.eventqueue$3.run(eventqueue.java:688) @ java.awt.eventqueue$3.run(eventqueue.java:686) @ java.security.accesscontroller.doprivileged(native method) @ java.security.protectiondomain$1.dointersectionprivilege(protectiondomain.java:76) @ java.security.protectiondomain$1.dointersectionprivilege(protectiondomain.java:87) @ java.awt.eventqueue$4.run(eventqueue.java:702) @ java.awt.eventqueue$4.run(eventqueue.java:700) @ java.security.accesscontroller.doprivileged(native method) @ java.security.protectiondomain$1.dointersectionprivilege(protectiondomain.java:76) @ java.awt.eventqueue.dispatchevent(eventqueue.java:699) @ java.awt.eventdispatchthread.pumponeeventforfilters(eventdispatchthread.java:242) @ java.awt.eventdispatchthread.pumpeventsforfilter(eventdispatchthread.java:161) @ java.awt.eventdispatchthread.pumpeventsforhierarchy(eventdispatchthread.java:150) @ java.awt.eventdispatchthread.pumpevents(eventdispatchthread.java:146) @ java.awt.eventdispatchthread.pumpevents(eventdispatchthread.java:138) @ java.awt.eventdispatchthread.run(eventdispatchthread.java:91)
debug output:
there 2 elements in roledata roledata has 2 elements performing while loop tabledata[0][0] assigned ecc tabledata[0][1] assigned 1 performing while loop tabledata[1][0] assigned portal tabledata[1][1] assigned 2 called getcolumncount() returned 2 tabledate has 2 columns , 2 rows. called getcolumncount() returned 2 called getcolumnname() returned role called getcolumncount() returned 2 called getcolumnname() returned sort order called getcolumncount() returned 2 arg :role data: clicked on role called getcolumnclass() called getcolumnclass() called getcolumnclass() called getcolumnclass() b: there 2 rows in roletablemodel add pressed
code:
package smc; import java.awt.component; import java.awt.event.actionevent; import java.awt.event.actionlistener; import java.util.arraylist; import java.util.collections; import java.util.iterator; import java.util.vector; import javax.swing.boxlayout; import javax.swing.jbutton; import javax.swing.jlabel; import javax.swing.jpanel; import javax.swing.jscrollpane; import javax.swing.jtable; import javax.swing.table.defaulttablemodel; /** * @author larry krigbaum */ public class rolecard { public jpanel getrolecard() { final jpanel rolecard = new jpanel(); rolecard.setlayout(new boxlayout(rolecard, boxlayout.page_axis)); rolecard.setalignmentx(component.center_alignment); jpanel role_title = new jpanel(); role_title.add(new jlabel(" ")); role_title.add(new jlabel("configure sap roles")); role_title.add(new jlabel(" ")); rolecard.add(role_title); final jpanel role_table = new jpanel(); string[] rolecolumnnames = {"role", "sort order"}; arraylist<role> roledata = role.loadroledata(); system.out.println("there " + roledata.size() + " elements in roledata"); //arraylist<role> roledata = null; final roletablemodel roletablemodel = new roletablemodel(rolecolumnnames, roledata); jtable roleedittable = new jtable(roletablemodel); roleedittable.setautocreaterowsorter(true); //final defaulttablemodel roletablemodel = (defaulttablemodel) roleedittable.getmodel(); //final jtable roleedittable = getroletable(); role_table.add(new jscrollpane(roleedittable)); // scrollpane needed show headers rolecard.add(role_table); jpanel buttonpanel = new jpanel(); jbutton addbutton = new jbutton("add"); addbutton.setactioncommand("add"); jbutton deletebutton = new jbutton("delete"); deletebutton.setactioncommand("delete"); final jbutton cancelbutton = new jbutton("cancel"); cancelbutton.setactioncommand("cancel"); cancelbutton.setenabled(false); buttonpanel.add(addbutton); buttonpanel.add(deletebutton); buttonpanel.add(cancelbutton); rolecard.add(buttonpanel); addbutton.addactionlistener(new actionlistener() { @override public void actionperformed(actionevent e) { system.out.println("b: there " + roletablemodel.getrowcount() + " rows in roletablemodel"); system.out.println("add pressed"); cancelbutton.setenabled(true); object[] newrole = null; roletablemodel.addrow(newrole); //object[] newrole = new object[] {" ", " "}; system.out.println("a: there " + roletablemodel.getrowcount() + " rows in roletablemodel"); //roletablemodel.setrowcount((roletablemodel.getrowcount()) + 1); system.out.println("b: there " + roletablemodel.getrowcount() + " rows in roletablemodel"); roletablemodel.firetablerowsinserted(roletablemodel.getrowcount(), roletablemodel.getrowcount()); roletablemodel.firetabledatachanged(); } }); deletebutton.addactionlistener(new actionlistener() { @override public void actionperformed(actionevent e) { system.out.println("delete pressed"); cancelbutton.setenabled(true); } }); cancelbutton.addactionlistener(new actionlistener() { @override public void actionperformed(actionevent e) { system.out.println("cancel pressed"); cancelbutton.setenabled(false); } }); return rolecard; } class roletablemodel extends defaulttablemodel { private string[] rolecolumnnames = {"role", "sort order"}; private object[][] tabledata; public roletablemodel(string[] rolecolumnnames, arraylist<role> roledata) { system.out.println("roledata has " + roledata.size() + " elements"); tabledata = new object[roledata.size()][2]; role role = new role(); collections.sort(roledata, role.makecomparator); iterator rolesorderbyrole = roledata.iterator(); int = 0; while (rolesorderbyrole.hasnext()) { system.out.println("performing while loop"); role = (role)rolesorderbyrole.next(); tabledata[i][0] = role.xrole; system.out.println("tabledata[" + + "][0] assigned " + tabledata[i][0]); tabledata[i][1] = role.sortorder; system.out.println("tabledata[" + + "][1] assigned " + tabledata[i][1]); i++; } system.out.println("tabledate has " + getcolumncount() + " columns , " + getrowcount() + " rows."); } @override public int getcolumncount() { system.out.println("called getcolumncount()"); system.out.println("returned " + rolecolumnnames.length); return rolecolumnnames.length; } @override public int getrowcount() { if (tabledata == null) return 0; return tabledata.length; } @override public string getcolumnname(int col) { system.out.println("called getcolumnname()"); system.out.println("returned " + rolecolumnnames[col]); return rolecolumnnames[col]; } @override public object getvalueat(int row, int col) { return tabledata[row][col]; } @override public class getcolumnclass(int c) { system.out.println("called getcolumnclass()"); return getvalueat(0, c).getclass(); } /* * don't need implement method unless table's * editable. */ @override public boolean iscelleditable(int row, int col) { system.out.println("called iscelleditable()"); //note data/cell address constant, //no matter cell appears onscreen. return true; } /* * don't need implement method unless table's * data can change. */ @override public void setvalueat(object value, int row, int col) { system.out.println("called setvalueat()"); tabledata[row][col] = value; firetablecellupdated(row, col); } }
you're creating table model extending defaulttablemodel. instead of delegating methods store data, store them in separate array of data. , override methods , not others. result sometimes, methods of superclass used, try , insert data in vector held super class, , sometimes, subclass methods used , set values from/to subclass array of data.
if need define custom tablemodel implementation, either extend asbtracttablemodel, , define want, or extend defaulttablemodel don't add define field. override methods need overridden, , delegate superclass methods.
except getcolumnclass()
, don't see reason override method in defaulttablemodel.
Comments
Post a Comment