ChnAreaDel deleting wrong rows in a string channel
I am trying to write a script in DIAdem 2010 SP1 to delete the first row of a group that contains two string channels and one time channel, but the
wrong data is being deleted from the string channels.
I start with a file that contains a group like this:
I run this code expecting the first row to be deleted
Dim logGroup
Set logGroup = Data.Root.ChannelGroups("Log")
Call ChnAreaDel(logGroup.Channels("Name"),1,1)
Call ChnAreaDel(logGroup.Channels("ID"),1,1)
Call ChnAreaDel(logGroup.Channels("Timestamp"),1,1)
but end up with this:
The first row of the Timestamp channel is deleted, but the Name and ID channels get their last rows deleted.
I have played around a bit and it seems to me that for a string channel ChnAreaDel only deletes from the last row.
Is there another function I should use?
Any help would be appreciated.
Thank You,
Joe
Solved!
Go to Solution.
Hi Joe,
I've reproduced that ChnAreaDel() bug you reported in both DIAdem 2010 and 2011-- really odd. In the meantime, you can use this older approach that uses a string parameter to point to the channel collection to remove the row(s) from:
Set logGroup = Data.Root.ChannelGroups("Noise data results")
ChnStr = ""
FOR Each Channel In logGroup.Channels
ChnStr = ChnStrAdd(ChnStr, Channel.Properties("Number").Value)
NEXT
Call DataBlDel(ChnStr, 1, 1)
Brad Turpin
DIAdem Product Support Engineer
National Instruments
Similar Messages
-
JTable - trying to delete a row of data using an Abstract TableModel
Hi Guys,
I am trying to delete a row of data on a JTable. What I am trying to accomplish is to highlight the row by a mouseclick,
then from the menu bar I am having the user select a "delete row" option. I am working with an abstract
Table Model with a deleteRow method. I know I am doing something wrong in this method but I'm not sure what... it is not deleting nor dynamically reflecting the deleted row of data on the JTable gui:
P.S. I am using a Vector of Vectors to store the data
Here are snippets of my main class and Abstract Table Model :
Main Class
Table definition and mouse listener:
usermodel = new DataFileTableModel("UserCtl.dat") ;
userTable = new JTable();
userTable.setModel(usermodel);
userTable.createDefaultColumnsFromModel();
userTable.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent evt) {
upoint = evt.getPoint();
rowToBeDeleted = userTable.rowAtPoint(upoint);
Menu Selection which calls the deleteRow Method in the model:
deleteitem = new JMenuItem("Delete Row",'D');
editmenu.add(deleteitem) ;
deleteitem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int delresp = JOptionPane.showConfirmDialog(null,"Are you sure you wish to delete this row ?",null, JOptionPane.YES_NO_OPTION) ;
switch(delresp) {
case JOptionPane.NO_OPTION:
return;
case JOptionPane.YES_OPTION:
switch (tabnum)
case 0:
usermodel.deleteRow(rowToBeDeleted);
break ;
Here is my Abstract Table Model... the deleteRow method is at the bottom:
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.event.*;
import java.io.*;
import java.util.*;
public class DataFileTableModel extends AbstractTableModel {
protected Vector data;
protected Vector columnNames ;
protected String datafile;
public DataFileTableModel(String f){
datafile = f;
initVectors();
public void initVectors() {
String aLine ;
data = new Vector();
columnNames = new Vector();
try {
FileInputStream fin = new FileInputStream(datafile);
BufferedReader br = new BufferedReader(new InputStreamReader(fin));
// extract column names
StringTokenizer st1 =
new StringTokenizer(br.readLine(), "|");
while(st1.hasMoreTokens())
columnNames.addElement(st1.nextToken());
// extract data
while ((aLine = br.readLine()) != null) {
StringTokenizer st2 =
new StringTokenizer(aLine, "|");
while(st2.hasMoreTokens())
data.addElement(st2.nextToken());
br.close();
catch (Exception e) {
e.printStackTrace();
public int getRowCount() {
return data.size() / getColumnCount();
public int getColumnCount(){
return columnNames.size();
public String getColumnName(int columnIndex) {
String colName = "";
if (columnIndex <= getColumnCount())
colName = (String)columnNames.elementAt(columnIndex);
return colName;
public Class getColumnClass(int columnIndex){
return String.class;
public boolean isCellEditable(int rowIndex, int columnIndex) {
return true;
public Object getValueAt(int rowIndex, int columnIndex) {
return (String)data.elementAt( (rowIndex * getColumnCount()) + columnIndex);
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
data.setElementAt(aValue, (rowIndex * getColumnCount())+columnIndex) ;
fireTableCellUpdated(rowIndex, columnIndex);
public void addRow(Object[] aRow) {
for (int i=0; i < aRow.length; i++)
data.add(aRow);
int size = getRowCount();
fireTableRowsInserted(size-1,size-1);
public void deleteRow(int rowNo)
if (rowNo < 0 || rowNo >= getRowCount())
return;
int colCount = getColumnCount();
int index = colCount * rowNo;
System.out.println("in deleteRow Row = " + rowNo);
System.out.println("colCount = " + colCount);
System.out.println("index = " + index) ;
for (int d = index; d <= colCount; d++)
data.remove(d) ;
fireTableRowsDeleted(rowNo,rowNo) ;Hi,
I can see one obvious problem. Your method to delete contains
for (int d = index; d <= colCount; d++)
data.remove(d) ;
which I think should be
for (int d = index; d <= colCount; d++)
data.remove(index) ;
because every time you remove the value at 'index' it replaces it with the value at 'index+1'.
I'm not sure that this is the only problem but ...
Roger -
hi when i click mt delete button it delete wrong information or values,it does not delete the value from the table it goes and delete value from my forms i drag and drop the correct delete button,am in jdeveloper 11.1.1.6.0
my button is
<af:commandButton actionListener="#{bindings.Delete1.execute}"
text="Remove Member"
id="cb8" immediate="true"/>hi this is what i have done
<af:commandButton actionListener="#{bindings.Delete1.execute}"
text="Delete"
id="cb10">
<af:setActionListener from="#{true}"
to="#{pageFlowScope.addMember.deleteAction}"/>
</af:commandButton>
private boolean deleteAction = false;
private boolean EditAction = false;
private boolean createAction = false;
private ViewRowImpl selectedJobs;
public void setDeleteAction(boolean deleteAction) {
this.deleteAction = deleteAction;
public boolean isDeleteAction() {
OIDOperations oIDOperations= new OIDOperations();
Map<Object,String> mp=new HashMap<Object, String>();
mp.put(getusrname(),getusrname());
oIDOperations.dropUsrRole(getorgname(), mp);
System.out.println("deleted user" +mp);
return deleteAction;
public void setEditAction(boolean EditAction) {
this.EditAction = EditAction;
public boolean isEditAction() {
FacesContext ctx = FacesContext.getCurrentInstance();
ExpressionFactory ef = ctx.getApplication().getExpressionFactory();
ValueExpression ve = ef.createValueExpression(ctx.getELContext(), "#{row.Username}",String.class);
//ValueExpression ve1 = ef.createValueExpression(ctx.getELContext(), "#{row.jobId}",String.class);
String Username = (String)ve.getValue(ctx.getELContext());
if(this.getSelectedJobs() != null){
this.EditAction=getSelectedJobs().getAttribute("Username").equals(Username);
return EditAction;
public void setCreateAction(boolean createAction) {
this.createAction = createAction;
public boolean isCreateAction() {
return createAction;
public void setSelectedJobs(ViewRowImpl newselectedJobs) {
this.selectedJobs = newselectedJobs;
if(this.selectedJobs != null){
this.EditAction = true;
}else{
this.EditAction = false;
this.createAction = false;
this.deleteAction = false;
public ViewRowImpl getSelectedJobs() {
return selectedJobs;
} -
How to delete a row in Numbers on iPhone?
I'm pulling my hair out on this one. The "Help" for Numbers for iPhone both in-app and on the web states that to:
Delete a row anywhere in the table: Tap the bar left of the row, then tap Delete.
So here is what I see before I tap the bar left of the row:
There is no bar left of the row unless I first tap into one of the cells. Then, when I tap the bar left of the row, this is what I get:
I see no "Delete" on which to tap. Nor do I see "Hide" or "Insert", which, according the the Help, should also be available options once I've tapped that left side bar. The only things I am able to do with the row are move it up or down, and change its height.
Am I missing something, doing something wrong, or is this a bug in Numbers? I'm on an iPhone 5s with auto app updates, so I have the latest version of Numbers.
ThanksHi Varcar,
Usually when I tap the bar, as you did, I get a popup menu with some choices. Cut, Copy, Paste then an arrow taht I can then tap to reveal Delete, Hide, Chart. Have you tried to retap on the blue highlight on that bar? It might just want more attention.
Quinn -
HOW TO DELETE THE ROW FROM DATABASE
hI,
Iam pasting my code below.My problem isi retrieve rows from database and display them in jsp page in rows.For each row there is delete hyperlink.Now when i click that link i should only delete the row corresponding to that delete link temporarily but it should not delete the row from database now.It should only delete the row from database when i click the save button.How can i do this can any one give some code.
thanks
naveen
[email protected]
<%@ page language="java" import="Utils.*,java.sql.*,SQLCon.ConnectionPool,java.util.Vector,java.util.StringTokenizer" %>
<html>
<head>
<meta http-equiv="Content-Language" content="en-us">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>Item Details</title>
<script>
function submitPage()
document.details.action = "itemdetails.jsp" ;
document.details.submit();
</script>
</head>
<body>
<form name="details" action="itemdetails.jsp" method="post">
<%
ConnectionPool pool;
Connection con = null;
Statement st;
ResultSet rs =null;
%>
<table border="0" cellpadding="0" cellspacing="0" width="328">
<tr>
<td width="323" colspan="4"><b>Reference No :</b> <input type="text" name="txt_refno" size="14">
<input type="submit" value="search" name="search" ></td>
</tr>
<tr>
<td width="81" bgcolor="#000099"><font color="#FFFFFF"><b>Item Code</b></font></td>
<td width="81" bgcolor="#000099"><font color="#FFFFFF"><b>Item No</b></font></td>
<td width="81" bgcolor="#000099"><font color="#FFFFFF"><b>Amount </b></font></td>
<td width="80" bgcolor="#000099"> </td>
</tr>
<%
pool= new ConnectionPool();
Utils utils = new Utils();
double total =0.00;
String search =utils.returnString(request.getParameter("search"));
if(search.equals("search"))
try
String ref_no =utils.returnString(request.getParameter("txt_refno"));
String strSQL="select * from ref_table where refno='" + ref_no + "' ";
con = pool.getConnection();
st=con.createStatement();
rs = st.executeQuery(strSQL);
while(rs.next())
String itemcode=rs.getString(2);
int item_no=rs.getInt(3);
double amount= rs.getDouble(4);
total= total + amount;
%>
<tr>
<td width="81"><input type=hidden name=hitem value=<%=itemcode%>><%=itemcode%></td>
<td width="81"><input type=hidden name=hitemno value=<%=item_no%>><%=item_no%></td>
<td width="81"><input type=hidden name=hamount value=<%=amount%>><%=amount%></td>
<td width="80"><a href="delete</td>
</tr>
<%
}catch(Exception e){}
finally {
if (con != null) pool.returnConnection(con);
%>
<tr>
<td width="323" colspan="4">
<p align="right"><b>Total:</b><input type="text" name="txt_total" size="10" value="<%=total%>"></td>
</tr>
<tr>
<td width="323" colspan="4">
<input type="button" value="save" name="save"></td>
</tr>
</table>
</form>
</body>
</html>You mean when you click on the hyperlink you want that row to disappear from the page, but not delete the row from the database until a commit/submit button is pressed?
Personally, I think I'd prefer that you have a delete checkbox next to every row and NOT remove them from the display if I was a user. You give your users a chance to change their mind about their choice, and when they're done they can see exactly which rows will be deleted before they commit.
You know your problem, of course, so you might have a good reason for designing it this way. But I'd prefer not removing them from the display. JMO - MOD -
How to delete a row in the table in servlets
I have met a problem in deleting a row in table using servlets.
My table looks like this:
ID Name Type
12 Milienium S
15 USIA O
My code looks like this:
String query = "SELECT * FROM tb_Funds";
rs = statement.executeQuery(query);
while(rs.next()) {
StdID=rs.getString("FundID");
StdName=rs.getString("Name");
StdType=rs.getString("Type");
out.print("<td><INPUT TYPE=TEXT NAME=
myName VALUE=" + StdID + "></td>");
out.print("<td>" + StdName + "</td>");
out.print("<td>" + StdType + "</td>");
buf.append("<td>" + "<INPUT TYPE=SUBMIT
NAME=Delete VALUE=DELETE>" + "</td></tr>");
There is a delete button in every row. May I know how to delete the row that I want by getting the ID from the table and delete it from the database.
Deleting from a table is simple -> delete from tb_funds where id = <value>. Obviously replace <value> with the appropriate ID or use a bind variable (a ?) and prepared statements.
Are you asking how to pass the id associated with the table row from the browser when the button is pressed? -
Hai
I have pasted the mxml below, because i am unable to attach the mxml, pl copy this below file into flex and run the application.
1. Run the application.
2. Enter values in the textbox and click add, values will be added to the datagrid.
3. now click AND or OR and then change the values in the second and thrid combobox and again click add.
4.Like wise change the combobox values and add five rows to the datagrid.
5.now if u delete the last row u can see the curent last row in the combobox, so that the AND or Or can be added to it
6. now if u delete a row in between, the deleted row's value oly maintains in the combobox,so i am unable to add AND or Or to the grid
7.I need the last row data in the datagrid to be in the second and third combobox, which ever row is deleted.
Can anyone help me....
Thanks in advance.
This is the mxml for sample
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
<![CDATA[
// ActionScript file
import mx.rpc.events.FaultEvent;
import mx.controls.Alert;
import mx.managers.CursorManager;
import mx.collections.ArrayCollection;
[Bindable]
public var adhoc:ArrayCollection = new ArrayCollection();
[Bindable]
public var serverString = "" ;
private function initImage(event:MouseEvent):void {
if(adhoc.length > 0){
CursorManager.setBusyCursor();
private function onChange():void{
if(comboBox.selectedIndex == 0){
}else{
private function onChange1():void{
if(combo2.selectedItem == "DATEDEPLOYED" || combo2.selectedItem == "DATEUPLOADED"){
datepick.visible = true
txt.visible = false
}else{
txt.visible = true
datepick.visible = false
private function add():void{
var str:String = txt.text;
if(str.length == 0 && txt.visible == true){
Alert.show("Value Can Not Be Empty");
return;
if(combo2.selectedItem != "DATEDEPLOYED" || combo2.selectedItem != "DATEUPLOADED"){
if(txt.visible == true){
var temp:Object = new Object();
temp.fname = combo2.selectedItem;
temp.opera = combo1.selectedItem;
temp.val = "'"+txt.text+"'";
adhoc.addItem(temp);
txt.text = "";
var str1:String = datepick.text;
if(comboBox.selectedIndex == 1){
if(combo2.selectedItem == "DATEDEPLOYED" || combo2.selectedItem == "DATEUPLOADED"){
if(str1.length == 0 && datepick.visible == true){
Alert.show("Date Cannot Be Empty");
}else{
var temp:Object = new Object();
temp.fname = combo2.selectedItem;
temp.opera = combo1.selectedItem;
temp.val = datepick.text;
adhoc.addItem(temp);
datepick.text = "";
addbutton.enabled = false;
addopenbracket.enabled = false;
combo2.enabled = false;
combo1.enabled = false;
private function querydelete():void{
if (AdHoc.selectedIndex > 0) {
if(AdHoc.selectedIndex == (adhoc.length-1)){
adhoc[AdHoc.selectedIndex-1].cond = "";
addopenbracket.enabled = false;
addclosebracket.enabled = false;
addbutton.enabled = false;
combo2.enabled = false;
combo1.enabled = false;
combo2.selectedItem = adhoc[adhoc.length-2].fname
combo1.selectedItem = adhoc[adhoc.length-2].opera
adhoc.removeItemAt(AdHoc.selectedIndex);
// adhocdetailgridcompilance.dataProvider = null ;
// adhocdetailgrid.dataProvider = null ;
}else if (adhoc.length == 1) {
adhoc.removeItemAt(AdHoc.selectedIndex);
// adhocdetailgridcompilance.dataProvider = null ;
// adhocdetailgrid.dataProvider = null ;
addopenbracket.enabled = true;
addclosebracket.enabled = true;
addbutton.enabled = true;
combo2.enabled = true;
combo1.enabled = true;
}else{
Alert.show("Select The Rows To Delete");
private function andSubmit():void{
for each(var obj:Object in adhoc){
if(obj.fname == combo2.selectedItem && obj.opera == combo1.selectedItem){
if(combo2.selectedItem != "DATEDEPLOYED" || combo2.selectedItem != "DATEUPLOADED"){
if(txt.visible == true){
trace("2 equals");
var temp:Object = new Object();
obj.cond = and.label
adhoc.setItemAt(obj,adhoc.getItemIndex(obj));
}else{
trace(obj.fname + ":" + combo2.selectedItem);
trace(obj.opera + ":" + combo1.selectedItem);
trace(obj.val + ":" + "'"+txt.text+"'");
}else if(obj.fname == addclosebracket.label){
if(combo2.selectedItem != "DATEDEPLOYED" || combo2.selectedItem != "DATEUPLOADED"){
if(txt.visible == true){
trace("2 equals");
var temp:Object = new Object();
obj.cond = and.label
adhoc.setItemAt(obj,adhoc.getItemIndex(obj));
}else{
trace(obj.fname + ":" + combo2.selectedItem);
trace(obj.opera + ":" + combo1.selectedItem);
trace(obj.val + ":" + "'"+txt.text+"'");
if(obj.fname == combo2.selectedItem && obj.opera == combo1.selectedItem){
if(combo2.selectedItem == "DATEDEPLOYED" || combo2.selectedItem == "DATEUPLOADED"){
if(datepick.visible == true){
trace("2 equals");
var temp:Object = new Object();
obj.cond = and.label
adhoc.setItemAt(obj,adhoc.getItemIndex(obj));
}else{
trace(obj.fname + ":" + combo2.selectedItem);
trace(obj.opera + ":" + combo1.selectedItem);
trace(obj.val + ":" + datepick.text);
}else if(obj.fname == addclosebracket.label){
if(combo2.selectedItem == "DATEDEPLOYED" || combo2.selectedItem == "DATEUPLOADED"){
if(txt.visible == true){
trace("2 equals");
var temp:Object = new Object();
obj.cond = and.label
adhoc.setItemAt(obj,adhoc.getItemIndex(obj));
}else{
trace(obj.fname + ":" + combo2.selectedItem);
trace(obj.opera + ":" + combo1.selectedItem);
trace(obj.val + ":" + datepick.text);
addbutton.enabled = true;
addopenbracket.enabled = true;
combo2.enabled = true;
combo1.enabled = true;
private function orSubmit():void{
for each(var obj:Object in adhoc){
if(obj.fname == combo2.selectedItem && obj.opera == combo1.selectedItem){
if(combo2.selectedItem != "DATEDEPLOYED" || combo2.selectedItem != "DATEUPLOADED"){
if(txt.visible == true){
trace("2 equals");
var temp:Object = new Object();
obj.cond = or.label
adhoc.setItemAt(obj,adhoc.getItemIndex(obj));
}else{
trace(obj.fname + ":" + combo2.selectedItem);
trace(obj.opera + ":" + combo1.selectedItem);
trace(obj.val + ":" + "'"+txt.text+"'");
}else if(obj.fname == addclosebracket.label){
if(combo2.selectedItem != "DATEDEPLOYED" || combo2.selectedItem != "DATEUPLOADED"){
if(txt.visible == true){
trace("2 equals");
var temp:Object = new Object();
obj.cond = or.label
adhoc.setItemAt(obj,adhoc.getItemIndex(obj));
}else{
trace(obj.fname + ":" + combo2.selectedItem);
trace(obj.opera + ":" + combo1.selectedItem);
trace(obj.val + ":" + "'"+txt.text+"'");
if(obj.fname == combo2.selectedItem && obj.opera == combo1.selectedItem){
if(combo2.selectedItem == "DATEDEPLOYED" || combo2.selectedItem == "DATEUPLOADED"){
if(datepick.visible == true){
trace("2 equals");
var temp:Object = new Object();
obj.cond = or.label
adhoc.setItemAt(obj,adhoc.getItemIndex(obj));
}else{
trace(obj.fname + ":" + combo2.selectedItem);
trace(obj.opera + ":" + combo1.selectedItem);
trace(obj.val + ":" + datepick.text);
}else if(obj.fname == addclosebracket.label){
if(combo2.selectedItem == "DATEDEPLOYED" || combo2.selectedItem == "DATEUPLOADED"){
if(txt.visible == true){
trace("2 equals");
var temp:Object = new Object();
obj.cond = or.label
adhoc.setItemAt(obj,adhoc.getItemIndex(obj));
}else{
trace(obj.fname + ":" + combo2.selectedItem);
trace(obj.opera + ":" + combo1.selectedItem);
trace(obj.val + ":" + datepick.text);
addbutton.enabled = true;
addopenbracket.enabled = true;
combo2.enabled = true;
combo1.enabled = true;
public function addOpenBracket():void{
var temp:Object = new Object();
temp.fname = addopenbracket.label
adhoc.addItem(temp);
addopenbracket.enabled = false
addclosebracket.enabled = true
if(adhoc.length > 1 && addopenbracket.enabled == false){
addbutton.enabled = true
public function addCloseBracket():void{
var temp:Object = new Object();
if(adhoc.length > 1){
temp.fname = addclosebracket.label
adhoc.addItem(temp);
addopenbracket.enabled = true
addclosebracket.enabled = false
if(adhoc.length > 1 && addclosebracket.enabled == false){
addbutton.enabled = true
private function dateChange(date:Date):void{
if (date == null){
}else{
txt.text = date.getDate() + '/' + (date.getMonth()+1).toString() + '/' +
date.getFullYear().toString() ;
public function saveadhoc(event:Event):void {
var AdhocRows:String = "";
var i:int ;
var selectedType = comboBox.selectedItem;
if(adhoc.length == 0){
Alert.show("Enter The Query");
}else{
for(i = 0; i < adhoc.length;i++) {
if(adhoc[i].fname != null){
AdhocRows = AdhocRows +adhoc[i].fname+" ";
if(adhoc[i].opera != null){
AdhocRows = AdhocRows + adhoc[i].opera+" ";
if(adhoc[i].val != null){
AdhocRows = AdhocRows + adhoc[i].val+" ";
if(adhoc[i].cond != null){
AdhocRows = AdhocRows + adhoc[i].cond+" ";
var parameters:Object = {adhocquery:AdhocRows,FlexActionType:"ADHOCQUERYSUBMIT",adhocType:selectedType};
// adhocClick.send(parameters);
private function retrieve():void{
datepick.visible = false
txt.visible = true
]]>
</mx:Script>
<mx:Array id="comp">
<mx:String>TYPE</mx:String>
<mx:String>AUDITRESULT</mx:String>
<mx:String>CATEGORY</mx:String>
<mx:String>CHILDRULE</mx:String>
<mx:String>PARENTRULE</mx:String>
<mx:String>AUDITGROUP</mx:String>
<mx:String>LOCATION</mx:String>
<mx:String>VENDOR</mx:String>
<mx:String>DEVICECATEGORY</mx:String>
</mx:Array>
<mx:Array id="inven">
<mx:String>VENDOR</mx:String>
<mx:String>DEVICETYPE</mx:String>
<mx:String>SERIES</mx:String>
<mx:String>MODEL</mx:String>
<mx:String>SUP/CPU</mx:String>
<mx:String>CODEVERSION</mx:String>
<mx:String>IMAGENAME</mx:String>
<mx:String>DATEDEPLOYED</mx:String>
<mx:String>LOCATIONNAME</mx:String>
<mx:String>ADDRESS1</mx:String>
<mx:String>ADDRESS2</mx:String>
<mx:String>CITY</mx:String>
<mx:String>STATE</mx:String>
<mx:String>COUNTRY</mx:String>
<mx:String>FLOOR</mx:String>
<mx:String>CABINET</mx:String>
<mx:String>CATEGORYNAME</mx:String>
<mx:String>DEPARTMENT</mx:String>
<mx:String>CONTACTNAME</mx:String>
<mx:String>CONTACTNUMBER</mx:String>
<mx:String>VERSION</mx:String>
<mx:String>FILENAME</mx:String>
<mx:String>DATEUPLOADED</mx:String>
</mx:Array>
<mx:Accordion x="13" y="55" width="230" height="492">
<mx:Form label="AdHoc Query Analyzer" width="100%" creationComplete="retrieve()" height="100%" color="#F2F8F9" backgroundColor="#020202">
<mx:Canvas label="Query" width="204" height="440" backgroundColor="#020202">
<mx:ComboBox x="66" y="287" width="134" id="comboBox" dataProvider="[COMPLIANCE , INVENTORY]" change="onChange()" color="#050505">
</mx:ComboBox>
<mx:ComboBox x="5" y="344" width="109.25" id="combo1" dataProvider="[=,!=,>,>=,<,<=,LIKE]" color="#010101"></mx:ComboBox>
<mx:TextInput x="119.25" y="344" width="77.75" id="txt" color="#050505"/>
<mx:Button x="3" y="401" label="Add" width="59" click="add()" id="addbutton" color="#FFFEFE" fillAlphas="[0.6, 0.4, 0.75, 0.65]" fillColors="[#FFFFFF, #CCCCCC, #EEEEEE, #EEEEEE]" borderColor="#B7BABC" themeColor="#009DFF"/>
<mx:Button x="66" y="401" label="Delete" width="63.25" click="querydelete()" color="#FFFEFE" fillAlphas="[0.6, 0.4, 0.75, 0.65]" fillColors="[#FFFFFF, #CCCCCC, #EEEEEE, #EEEEEE]" borderColor="#B7BABC" themeColor="#009DFF"/>
<mx:Button x="2" y="373" label="(" id="addopenbracket" click="addOpenBracket()" width="45" color="#FFFEFE" fillAlphas="[0.6, 0.4, 0.75, 0.65]" fillColors="[#FFFFFF, #CCCCCC, #EEEEEE, #EEEEEE]" borderColor="#B7BABC" themeColor="#009DFF"/>
<mx:Button x="51" y="373" label=")" id="addclosebracket" click="addCloseBracket()" width="45" color="#FFFEFE" fillAlphas="[0.6, 0.4, 0.75, 0.65]" fillColors="[#FFFFFF, #CCCCCC, #EEEEEE, #EEEEEE]" borderColor="#B7BABC" themeColor="#009DFF"/>
<mx:Button x="134.25" y="401" label="Submit" click="saveadhoc(event);initImage(event)" color="#FFFEFE" fillAlphas="[1.0, 0.69, 0.75, 0.65]" fillColors="[#77B97A, #77B97A, #EEEEEE, #EEEEEE]" borderColor="#77B97A" themeColor="#009DFF"/>
<mx:ComboBox x="66" y="317" width="134" id="combo2" change="onChange1()" dataProvider="{comp}" color="#010101">
</mx:ComboBox>
<mx:DateField x="122.25" y="344" width="74.75" initialize="dateChange((event.target).selectedDate)" id="datepick" color="#050505"/>
<mx:DataGrid x="1" y="1" width="203" height="282" id="AdHoc" dataProvider="{adhoc}" allowMultipleSelection="true" color="#020202">
<mx:columns>
<mx:DataGridColumn headerText="Name" dataField="fname" id="fnam"/>
<mx:DataGridColumn headerText="Operator" dataField="opera" id="ope"/>
<mx:DataGridColumn headerText="Value" dataField="val" id="valu"/>
<mx:DataGridColumn headerText="Condition" dataField="cond" id="condt"/>
</mx:columns>
</mx:DataGrid>
<mx:Button x="99" y="373" label="AND" width="52" click="andSubmit()" id="and" color="#FFFEFE" fillAlphas="[0.6, 0.4, 0.75, 0.65]" fillColors="[#FFFFFF, #CCCCCC, #EEEEEE, #EEEEEE]" borderColor="#B7BABC" themeColor="#009DFF"/>
<mx:Button x="154" y="373" label="OR" width="49" click="orSubmit()" id="or" color="#FFFEFE" fillAlphas="[0.6, 0.4, 0.75, 0.65]" fillColors="[#FFFFFF, #CCCCCC, #EEEEEE, #EEEEEE]" borderColor="#B7BABC" themeColor="#009DFF"/>
<mx:Label x="7" y="291" text="TYPE" width="59" fontWeight="bold"/>
<mx:Label x="5" y="319" text="DISPLAY" width="59" fontWeight="bold"/>
</mx:Canvas>
</mx:Form>
</mx:Accordion>
</mx:Application>Ok... but I am a little confused (sorry to be a nuisance ),
my delete function within my webService requires an ID to be
passed from the Flex application, thus when a row is selected, the
ID of the selected row is taken, so when the Delete button is
pressed it sends this ID to the webService where it is taken and
used - and therefore deleting the row etc.....
Do you mean to define the result handler for the deleteOPG
operation in the main webService tag, i.e. :
<mx:WebService id="wsData" wsdl=http://...?wsdl>
<mx:operation name="getRes" result="handleWSR(event)"/>
<mx:operation name="deleteOPG"
result="handleWSR_deleteOPG(event)"/>
</mx:WebService>
and then call it in my delete function, passing the ID from
my delete function to my new result handler function ??? :
Thanks,
Jon. -
I have MyTableModel class:
class MyTableModel extends AbstractTableModel{
private Object columnNames[];
private Object[][] data;
public MyTableModel(Vector colonne, Vector corpoTabella){
columnNames= new Object[colonne.size()];
int nRighe=corpoTabella.size()/colonne.size();
data=new Object[nRighe][colonne.size()];
//inizializzo l'intestazione della tabella:
columnNames= colonne.toArray();
//inizializzo il corpo della tabella
for(int i=0, k=0;i<nRighe;i++){
for(int j=0;j<colonne.size();j++){
data[i][j]=corpoTabella.get(k);
k++;
public int getColumnCount() {
return columnNames.length;
public int getRowCount() {
return data.length;
public String getColumnName(int col) {
return String.valueOf(columnNames[col]);
public Object getValueAt(int row, int col) {
return data[row][col];
public boolean isCellEditable(int row, int col) {
return false;
}And I use it to create a JTable:
table=new JTable(new MyTableModel(colonne,corpo));I read on the tutorial to delete a row I have to use the DefaultTableModel in order to activate the removeRow method, but now how could I implementate it to delete rows?ok now I have:
modelloTab=new MyTableModel(colonne,corpo);
table=new JTable(modelloTab);
class MyTableModel extends DefaultTableModel{
so I can write without errors:modelloTab.removeRow(0)but despite I wrote a lot of rows in the table when I run it I have a java.lang.ArrayIndexOutOfBoundsException ...what can I do?
Edited by: cassio_steel on Aug 25, 2008 1:52 AM
Edited by: cassio_steel on Aug 25, 2008 1:56 AM -
I am trying to delete a row from a JTable whenever the button on the last column is pressed. I know to do this, I can use the removeRow(int) method of the tableModel. But the odd thing is when I try to get a handle to the TableModel from the JTable to use that function, i.e. table.getModel().removeRow(int) it doesn't work. But if I explicitly pass in the tableModel into my class it does work. Here's the code below:
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.UIManager;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableCellEditor;
import javax.swing.AbstractCellEditor;
import javax.swing.table.DefaultTableModel;
public class tester4 extends JFrame
protected final int BUTTON_COL = 2;
private TableCellRenderer defaultRenderer;
private TableCellEditor defaultEditor;
private JTable workingTable;
private String[] transactionCols = {"Qty", "Product", "Cancel"};
private Object[][] data = {{5, "prod1", "Cancel"},
{6, "prod2", "Cancel"},
{7, "prod3", "Cancel"}};
public tester4()
workingTable = new JTable(tableModel);
workingTable.setName("Working Table");
defaultRenderer = workingTable.getDefaultRenderer(JButton.class);
defaultEditor = workingTable.getDefaultEditor(Object.class);
StatusTableRenderer testRenderer = new StatusTableRenderer(defaultRenderer, defaultEditor, workingTable, tableModel);
workingTable.setDefaultRenderer(Object.class, testRenderer);
workingTable.setDefaultEditor(Object.class, testRenderer);
JScrollPane scrollPane = new JScrollPane( workingTable );
getContentPane().add( scrollPane );
private DefaultTableModel tableModel = new DefaultTableModel(data, transactionCols){
// Only allow button column to be editable, if there is an actual
// button in that row
public boolean isCellEditable(int row, int col){
return (col == BUTTON_COL && data[row][col] != "") ? true : false;
// Overriden getColumnClass method that will return the object
// class type of the first instance of the data type otherwise
// returns the Object.class
public Class getColumnClass(int column){
for (int row = 0; row < getRowCount(); row++){
Object o = getValueAt(row, column);
if (o != null){ return o.getClass(); }
return Object.class;
public static void main(String[] args)
tester4 frame = new tester4();
frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
frame.pack();
frame.setVisible(true);
public class StatusTableRenderer extends AbstractCellEditor
implements TableCellRenderer,
TableCellEditor,
ActionListener{
private TableCellRenderer defaultRenderer;
private TableCellEditor defaultEditor;
private JButton cancelButton;
private JButton editButton;
private String text;
private int buttonColumn;
private int selectedRow;
private JTable table;
private DefaultTableModel tableModel;
public StatusTableRenderer(TableCellRenderer renderer,
TableCellEditor editor,
JTable table,
DefaultTableModel tableModel){
defaultRenderer = renderer;
defaultEditor = editor;
this.table = table;
this.tableModel = tableModel;
buttonColumn = table.getColumnCount() - 1;
cancelButton = new JButton();
editButton = new JButton();
editButton.setFocusPainted(true);
editButton.addActionListener(this);
public StatusTableRenderer(TableCellRenderer renderer,
TableCellEditor editor,
JTable table,
DefaultTableModel tableModel,
int _buttonColumn){
this(renderer, editor, table, tableModel);
buttonColumn = _buttonColumn;
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
if (column == buttonColumn){
if (hasFocus){
cancelButton.setForeground(table.getForeground());
cancelButton.setBackground(UIManager.getColor("Button.background"));
else if (isSelected){
cancelButton.setForeground(table.getSelectionForeground());
cancelButton.setBackground(table.getSelectionBackground());
else{
cancelButton.setForeground(table.getForeground());
cancelButton.setBackground(UIManager.getColor("Button.background"));
cancelButton.setText( (value == null) ? "" : value.toString() );
return cancelButton;
return defaultRenderer.getTableCellRendererComponent(
table, value, isSelected, hasFocus, row, column);
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row, int column){
if (column == buttonColumn){
text = ((value == null) ? "": value.toString());
editButton.setText(text);
selectedRow = row;
return editButton;
return defaultEditor.getTableCellEditorComponent(
table, value, isSelected, row, column);
public Object getCellEditorValue()
return text;
public void actionPerformed(ActionEvent e)
fireEditingStopped();
// This works
tableModel.removeRow(selectedRow);
// This does not work
// table.getModel().removeRow(selectedRow);
}Take a look at the actionPerfformed method. One way of doing it works, one doesn't. Just trying to understand why me getting a handle to the tableModel through the table doesn't work.
Message was edited by:
deadseasquirrelsIt gives me a run-time error Well then your question should be "why do I get this run-time error" and then you would quote the error. Be more descriptive. "It doesn't work" is not descriptive.
table.getModel().removeRow(selectedRow);I don't use JDK1.5 either. But if you are saying that the above line compiles cleanly with JDK1.5 (because of the auto-boxing feature, or whatever its called), then I see no reason why the code wouldn't work since it recognizes the class as a DefaultTableModel.
Presumably you commented out the other line so you don't try to delete the row twice. Otherwise you might be getting a indexing error. -
Deleting a row from a database...
Here is the method I am calling to delete a row from a database. I keep getting this error, but I am not sure why.
Error: "Too few parameters. Expected 1."
//To delete a row
public void removeRow(String x, String y) {
try {
Statement stmt = con.createStatement();
//delete row with same x and y
//first is a string and second is a number
String query = "DELETE * FROM table WHERE first = '" +x+ "' AND " +
"second = " +Integer.parseInt(y);
int result = stmt.executeUpdate(query); //runs delete query, ERROR HERE *************
System.out.println("Test"); //debug statement, never gets here
//deletion confirmation message
JOptionPane.showMessageDialog(null, "Row deleted",
"Delete Reservation", JOptionPane.INFORMATION_MESSAGE);
catch (Exception e) { System.out.println(e); }Additionally, in the future you might want to use:
catch(SQLException sqlx) {
System.out.println( sqlx.getSQLState()
+"\t"+sqlx.getMessage()
+"\t"+sqlx.getErrorCode() );... It'll help with diagnostics.
☺Bill -
Deleting a row from a Parent VO gives NullPointerException
I am using JDev 11.1.1.2.0
Deleting a row from a Parent VO gives NullPointerException raised from oracle.jbo.server.EntityImpl.vetoRemoveWithDetails(EntityImpl.java:8214)
Here is my implementation:
There are two Entity Objects(Named "Parent" and "Child").
Both EO are NOT based on a database table. (These are populated from a method in the AM, the method calls a database API that returns an nested array and this array is used to populate the Parent and Child entities)
All attributes in these entity objects are Non-persistent.
The View Object "ParentEv" is based on "Parent" EO
The View Object "ChildEv" is based on "Child" EO
The View Objects "ParentEv" and "ChildEv" are linked by a view link.
The Entities "Parent" and"Child" are linked by Entity Association ( as "Composition Association" with "Implement Cascade Delete" checked.)
I am programatically deleting and populating the View Objects ParentEv and ChildEv from a method in the AM.
The first time I execute the method in BC Tester, it works fine.
The second time I execute the method it works fine.
But on third execution, it gives the below error which seems to be NullPointerException raised from oracle.jbo.server.EntityImpl.vetoRemoveWithDetails(EntityImpl.java:8214)
I am able to reproduce this in a test case scenario. It always works the first 2 times and fails when the method to delete and populate the VOs is executed a 3rd time.
If we base the "Parent" and "Child" entities on some dummy database views, it works fine, the problem only occurs when the Entities are NOT based on any table.
Can someone advise on what could be causing this issue?
Thanks,
Mitesh.Here's the method that I use in my test case to populate the VOs.
* This method populates the VOs ParentEv and ChildEv.
* These VOs are based on EOs Paren and Child, respectively.
* Before populating the VOs I am deleting any existing rows.
* The first two times this method is executed, it works fine.
* The third time this method executes it gives a nullpointerexception raised from
* oracle.jbo.server.EntityImpl.vetoRemoveWithDetails(EntityImpl.java:8214)
public void populateMethod(){
int rowCount = getParentEv().getRowCount();
for (int i = 0; i < rowCount; i++) {
Row row = getParentEv().last();
if(row!=null)
row.remove();
rowCount = getChildEv().getRowCount();
for (int i = 0; i < rowCount; i++) {
Row row = getChildEv().last();
if(row!=null)
row.remove();
int k = 0;
for (int i = 1; i < 5; i++) {
ParentEvRowImpl parentEvRow = (ParentEvRowImpl)getParentEv().createRow();
parentEvRow.setParentPk("Parent " + i);
parentEvRow.setParentDesc("Parent Desc " + i);
getParentEv().insertRow(parentEvRow);
for (int j = 1; j < 5; j++) {
k++;
ChildEvRowImpl childEvRow = (ChildEvRowImpl)getChildEv().createRow();
childEvRow.setChildPk("Child " + k);
childEvRow.setChildDesc("Child Desc " + k);
getChildEv().insertRow(childEvRow);
}==============================================================================
Here is the Parent.xml for the Parent EO:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE Entity SYSTEM "jbo_03_01.dtd">
<!---->
<Entity
xmlns="http://xmlns.oracle.com/bc4j"
Name="Parent"
Version="11.1.1.55.36"
AliasName="Parent"
BindingStyle="OracleName"
UseGlueCode="false"
RowClass="oracle.jbo.server.EntityImpl"
DefClass="oracle.jbo.server.EntityDefImpl"
CollClass="oracle.jbo.server.EntityCache">
<DesignTime>
<AttrArray Name="_publishEvents"/>
</DesignTime>
<Attribute
Name="ParentPk"
IsQueriable="false"
IsPersistent="false"
ColumnName="PARENTPK"
SQLType="VARCHAR"
Type="java.lang.String"
ColumnType="$none$"
PrimaryKey="true"/>
<Attribute
Name="ParentDesc"
IsQueriable="false"
IsPersistent="false"
ColumnName="$none$"
SQLType="VARCHAR"
Type="java.lang.String"
ColumnType="$none$"/>
<AccessorAttribute
Name="Child"
Association="model.eo.ea.ChildParentAssoc"
AssociationEnd="model.eo.ea.ChildParentAssoc.Child"
AssociationOtherEnd="model.eo.ea.ChildParentAssoc.Parent"
Type="oracle.jbo.RowIterator"
IsUpdateable="false"/>
</Entity>==============================================================================
Here is the Child.xml for the Child EO:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE Entity SYSTEM "jbo_03_01.dtd">
<!---->
<Entity
xmlns="http://xmlns.oracle.com/bc4j"
Name="Child"
Version="11.1.1.55.36"
AliasName="Child"
BindingStyle="OracleName"
UseGlueCode="false">
<DesignTime>
<AttrArray Name="_publishEvents"/>
</DesignTime>
<Attribute
Name="ChildPk"
IsUpdateable="while_insert"
IsQueriable="false"
IsPersistent="false"
IsNotNull="true"
ColumnName="CHILDPK"
SQLType="VARCHAR"
Type="java.lang.String"
ColumnType="$none$"
PrimaryKey="true"/>
<Attribute
Name="ChildDesc"
IsQueriable="false"
IsPersistent="false"
ColumnName="$none$"
SQLType="VARCHAR"
Type="java.lang.String"
ColumnType="$none$"/>
<Attribute
Name="ParentPk"
IsQueriable="false"
IsPersistent="false"
IsNotNull="true"
ColumnName="$none$"
SQLType="VARCHAR"
Type="java.lang.String"
ColumnType="$none$"/>
</Entity>==============================================================================
Here is the ChildParentAssoc.xml for the Association between Parent and Child EOs:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE Association SYSTEM "jbo_03_01.dtd">
<!---->
<Association
xmlns="http://xmlns.oracle.com/bc4j"
Name="ChildParentAssoc"
Version="11.1.1.55.36">
<DesignTime>
<Attr Name="_isCodegen" Value="true"/>
</DesignTime>
<AssociationEnd
Name="Parent"
Cardinality="1"
Source="true"
Owner="model.eo.Parent"
DeleteContainee="true"
LockLevel="NONE"
ExposedAccessor="false">
<DesignTime>
<Attr Name="_aggregation" Value="0"/>
<Attr Name="_finderName" Value="Parent"/>
<Attr Name="_isUpdateable" Value="true"/>
<Attr Name="_minCardinality" Value="1"/>
</DesignTime>
<AttrArray Name="Attributes">
<Item Value="model.eo.Parent.ParentPk"/>
</AttrArray>
</AssociationEnd>
<AssociationEnd
Name="Child"
Cardinality="-1"
Owner="model.eo.Child"
HasOwner="true">
<DesignTime>
<Attr Name="_aggregation" Value="0"/>
<Attr Name="_finderName" Value="Child"/>
<Attr Name="_isUpdateable" Value="true"/>
</DesignTime>
<AttrArray Name="Attributes">
<Item Value="model.eo.Child.ParentPk"/>
</AttrArray>
</AssociationEnd>
</Association>==============================================================================
Here is the ParentEv.xml for the ParentEv VO:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE ViewObject SYSTEM "jbo_03_01.dtd">
<!---->
<ViewObject
xmlns="http://xmlns.oracle.com/bc4j"
Name="ParentEv"
Version="11.1.1.55.36"
BindingStyle="OracleName"
CustomQuery="true"
RowClass="model.vo.ev.ParentEvRowImpl"
ComponentClass="model.vo.ev.ParentEvImpl"
PageIterMode="Full"
UseGlueCode="false">
<DesignTime>
<Attr Name="_codeGenFlag2" Value="Access|Coll"/>
<Attr Name="_isExpertMode" Value="true"/>
<Attr Name="_isCodegen" Value="true"/>
</DesignTime>
<EntityUsage
Name="Parent"
Entity="model.eo.Parent"/>
<ViewAttribute
Name="ParentDesc"
IsSelected="false"
IsQueriable="false"
IsPersistent="false"
PrecisionRule="true"
Precision="255"
EntityAttrName="ParentDesc"
EntityUsage="Parent"
AliasName="PARENTDESC"/>
<ViewAttribute
Name="ParentPk"
IsQueriable="false"
IsPersistent="false"
PrecisionRule="true"
EntityAttrName="ParentPk"
EntityUsage="Parent"/>
<ViewLinkAccessor
Name="ChildEv"
ViewLink="model.vo.vl.ChildEvParentEvVl"
Type="oracle.jbo.RowIterator"
IsUpdateable="false"/>
</ViewObject>==============================================================================
Here is the ChildEv.xml for the ChildEv VO:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE ViewObject SYSTEM "jbo_03_01.dtd">
<!---->
<ViewObject
xmlns="http://xmlns.oracle.com/bc4j"
Name="ChildEv"
Version="11.1.1.55.36"
BindingStyle="OracleName"
CustomQuery="true"
RowClass="model.vo.ev.ChildEvRowImpl"
ComponentClass="model.vo.ev.ChildEvImpl"
PageIterMode="Full"
UseGlueCode="false">
<DesignTime>
<Attr Name="_codeGenFlag2" Value="Access|Coll"/>
<Attr Name="_isExpertMode" Value="true"/>
<Attr Name="_isCodegen" Value="true"/>
</DesignTime>
<EntityUsage
Name="Child"
Entity="model.eo.Child"/>
<ViewAttribute
Name="ChildDesc"
IsSelected="false"
IsQueriable="false"
IsPersistent="false"
PrecisionRule="true"
Precision="255"
EntityAttrName="ChildDesc"
EntityUsage="Child"
AliasName="CHILDDESC"/>
<ViewAttribute
Name="ChildPk"
IsUpdateable="while_insert"
IsQueriable="false"
IsPersistent="false"
IsNotNull="true"
PrecisionRule="true"
EntityAttrName="ChildPk"
EntityUsage="Child"/>
<ViewAttribute
Name="ParentPk"
IsQueriable="false"
IsPersistent="false"
IsNotNull="true"
PrecisionRule="true"
EntityAttrName="ParentPk"
EntityUsage="Child"/>
</ViewObject>==============================================================================
Here is the ChildEvParentEvVl.xml for the view link between ParentEv and ChildEv VOs:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE ViewLink SYSTEM "jbo_03_01.dtd">
<!---->
<ViewLink
xmlns="http://xmlns.oracle.com/bc4j"
Name="ChildEvParentEvVl"
Version="11.1.1.55.36">
<DesignTime>
<Attr Name="_isCodegen" Value="true"/>
</DesignTime>
<ViewLinkDefEnd
Name="ParentEv"
Cardinality="1"
Owner="model.vo.ev.ParentEv"
Source="true">
<DesignTime>
<Attr Name="_finderName" Value="ParentEv"/>
<Attr Name="_isUpdateable" Value="true"/>
</DesignTime>
<AttrArray Name="Attributes">
<Item Value="model.vo.ev.ParentEv.ParentPk"/>
</AttrArray>
</ViewLinkDefEnd>
<ViewLinkDefEnd
Name="ChildEv"
Cardinality="-1"
Owner="model.vo.ev.ChildEv">
<DesignTime>
<Attr Name="_finderName" Value="ChildEv"/>
<Attr Name="_isUpdateable" Value="true"/>
</DesignTime>
<AttrArray Name="Attributes">
<Item Value="model.vo.ev.ChildEv.ParentPk"/>
</AttrArray>
</ViewLinkDefEnd>
</ViewLink> -
Deleting a row from a JTable using a custom TableModel
Before I waste any of your time I would like to go ahead and just say that I have searched through the forum using "delete row from Jtable" as the search keywords and while I have found very closely related issues, they have not solved my problem. I have found code postings by carmickr and his arguments as to why we should use DefaultTableModel instead of having created our own custom TableModel, and while I do agree, I just am not quite confident enough in applying it to my scenario. See I am reading from a file a bunch of Contractor objects and I am stuffing it into an arraylist which I am using in the following code posting to populate my TableModel which the JTable object in the gui then uses.
My problem is that everything works except when I delete and when I delete I understand that the index is changing because I just removed a row from the arraylist object. Suppose I have 33 rows displaying in the GUI. Now after I delete say row #23, the delete function works and dutifuly the row disappears from the table, but if I try to delete a row say...the last row, it does not work and throws me an IndexOutOfBoundsException which totally makes sense. My question is how do I go about fixing it? Do I have to do something with the setRowCount method?
Any help is appreciated.
Cheers,
Surya
* ContractorTableModel.java
* Created on January 12, 2006, 11:59 PM
package code.suncertify.gui;
import java.util.ArrayList;
import java.util.logging.Logger;
import javax.swing.table.AbstractTableModel;
import code.suncertify.db.Contractor;
* @author Surya De
* @version 1.0
public class ContractorTableModel extends AbstractTableModel {
* The Logger instance. All log messages from this class are routed through
* this member. The Logger namespace is <code>sampleproject.gui</code>.
private Logger log = Logger.getLogger("code.gui");
* An array of <code>String</code> objects representing the table headers.
private String [] headerNames = {"Record Number", "Contractor Name",
"Location", "Specialties","Size", "Rate",
"Owner"};
* Holds all Contractor instances displayed in the main table.
private ArrayList <Object> contractorRecords = new ArrayList<Object>(5);
* Returns the column count of the table.
* @return An integer indicating the number or columns in the table.
public int getColumnCount() {
return this.headerNames.length;
* Returns the number of rows in the table.
* @return An integer indicating the number of rows in the table.
public int getRowCount() {
return this.contractorRecords.size();
* Gets a value from a specified index in the table.
* @param row An integer representing the row index.
* @param column An integer representing the column index.
* @return The object located at the specified row and column.
public Object getValueAt(int row, int column) {
Object [] temp = (Object[]) this.contractorRecords.get(row);
return temp[column];
* Sets the cell value at a specified index.
* @param obj The object that is placed in the table cell.
* @param row The row index.
* @param column The column index.
public void setValueAt(Object obj, int row, int column) {
Object [] temp = (Object []) this.contractorRecords.get(row);
temp [column] = obj;
* Returns the name of a column at a given column index.
* @param column The specified column index.
* @return A String containing the column name.
public String getColumnName(int column) {
return headerNames[column];
* Given a row and column index, indicates if a table cell can be edited.
* @param row Specified row index.
* @param column Specified column index.
* @return A boolean indicating if a cell is editable.
public boolean isCellEditable(int row, int column) {
return false;
* Adds a row of Contractor data to the table.
* @param specialty
* @param recNo The record number of the row in question.
* @param name The name of the contractor.
* @param location Where the contractor is located
* @param size Number of workers for the contractor
* @param rate The contractor specific charge rate
* @param owner Name of owner
public void addContractorRecord(int recNo, String name,
String location, String specialty,
int size, float rate, String owner) {
Object [] temp = {new Integer(recNo), name,
location, specialty, new Integer(size),
new Float(rate), owner};
this.contractorRecords.add(temp);
fireTableDataChanged();
* Adds a Contractor object to the table.
* @param contractor The Contractor object to add to the table.
public void addContractorRecord(Contractor contractor) {
Object [] temp = {new Integer(contractor.getRecordNumber()),
contractor.getName(), contractor.getLocation(),
contractor.getSpecialties(), new Integer(contractor.getSize()),
new Float(contractor.getRate()), contractor.getCustomerID()};
this.contractorRecords.add(temp);
fireTableDataChanged();
* Deletes a row of Contractor data to the table.
* @FIXME Now that I deleted a row then I will have to reset the internal structure so that I can delete again
* @param recNo The record number of the row in question.
public void deleteContractorRecord(int recNo) {
contractorRecords.remove(recNo - 1);
fireTableRowsDeleted(recNo -1, recNo - 1);
}Wow that was a very quick response. Thanks camickr. I am only trying to delete a single row. I do not know how to go about posting a test program for the code I have posted above because honestly the gui itself is 800 lines of code, and then the file reading class is quite funky in itself. I can maybe email you the entire Netbeans project including code so if you are using Netbeans 5 RC2 you can run the code and see for yourself, but that would not be considerate of me.
See I am trying to delete any row at any time...but only one at a time not multiple rows...so if a user decides to delete row 23 and then tries to delete the last row which happens to be row 33 in my case, my setup should be smart enough to still allow to delete the row. -
AbstractTableModel-- Delete a row (pls help.....)
Hi !
I have a JTable of AbstractTableModel. now if i have to delete a row how can I ?
pls post a sample code...
FYI : This is my JTable
class ViewTable extends AbstractTableModel{
private String[] columnNames = {"COMP",
"FILE NAME",
"FILE LOCATION",
"HOT #",
"APPLIED ON",
"DELETE"};
private Object [][] data = new Object [50][6];
private Class types[]=new Class[]{ String.class,String.class,String.class,String.class,String.class,Boolean.class};
public void setValues()
for(int i=0;i< data.length;i++)
data[0]=null;
data[i][1]=null;
data[i][2]=null;
data[i][3]=null;
data[i][4]=null;
data[i][5]=new Boolean(false);
public int getColumnCount() {
return columnNames.length;
public int getRowCount() {
return data.length;
public String getColumnName(int col) {
return columnNames[col];
public Object getValueAt(int row, int col) {
return data[row][col];
public Class getColumnClass(int c) {
return types[c];
public boolean isCellEditable(int row, int col) {
//Note that the data/cell address is constant,
//no matter where the cell appears onscreen.
if (col < 2) {
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);
I create the Table like this...ViewTable VT= new ViewTable();
view_table = new JTable(VT);dashok.83 wrote:
yes.. How can I have the last column as checkBox....Make the last column boolean. You should extend the DefaultTableModel class and override the getColumnClass to return the appropriate class to get the appropriate behaviour (for instance I think that it's Boolean.class to get a check mark). Have you looked through the Sun tutorials on this? You should do this before asking the question here. -
How to Add and delete a row while using Abstract Table Model
Hi,
I need to do the following functionalities in JTable.I've done tht but a small problem.
1. Adding a row (Using addRow() method from DefaultTableModel).
2. Deleting a row(Using setRowCount() method from Default Table Model).
3. Sorting the table based on the selection of column(Using TableSorter which is using AbstracTableModel).
As the sorting is mandatory i've to change my model to Abtract Table Model
The problem is this Abstract Table Model doesn't have any methods to Add a row or deleting a row (setRowCount()).If anybody has written any utility method for this using Abstract Table Model help me.Using TableSorter which is using AbstracTableModel).If your talking about the TableSorter class from the Swing tutorial, then you create the TableSorter class by passing it a TableModel. There is no reason you can't use the DefaltTableModel.
I changed the code in TableSorterDemo as follows:
String[] columnNames = {"First Name",
"Last Name",
"Sport",
"# of Years",
"Vegetarian"};
Object[][] data = {
{"Mary", "Campione",
"Snowboarding", new BigDecimal(1), new Boolean(false)},
{"Alison", "Huml",
"Rowing", new BigDecimal(3), new Boolean(true)},
{"Kathy", "Walrath",
"Knitting", new BigDecimal(2), new Boolean(false)},
{"Sharon", "Zakhour",
"Speed reading", new BigDecimal(20), new Boolean(true)},
{"Philip", "Milne",
"Pool", new BigDecimal(10), new Boolean(false)}
DefaultTableModel model = new DefaultTableModel(data, columnNames)
public Class getColumnClass(int c)
return getValueAt(0, c).getClass();
TableSorter sorter = new TableSorter(model);
// TableSorter sorter = new TableSorter(new MyTableModel()); //ADDED THIS -
Problem of deletion of rows in jtable, table refreshing too
Hi,
I have a table with empty rows in the beginning with some custom properties( columns have fixed width...), later user would be adding to the rows to this table and can delete, I've a problem while deleting the rows from table,
When a selected row is deleted the model is also deleting the data but the table(view) is not refreshed.
Actually i'm selecting a cell of a row, then hitting the delete button.
So the model is deleting the information, but i'm not able to c the fresh data in table( especially when the last cell of last row is selectd and hit the delete button, i am getting lots of exception)
Kindly copy the below code and execute it, and let me know,
* AuditPanel.java
* Created on August 30, 2002, 3:05 AM
import javax.swing.*;
import java.awt.*;
import javax.swing.table.*;
import java.awt.event.*;
import javax.swing.event.*;
import java.util.Vector;
* @author yaman
public class AuditPanel extends javax.swing.JPanel {
// These are the combobox values
private String[] acceptenceOptions;
private Vector colNames;
private Color rowSelectionBackground = Color.yellow;
private int rowHeight = 20;
private int column0Width =70;
private int column1Width =96;
private int column2Width =327;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel1;
private javax.swing.JButton jButton2;
private javax.swing.JButton jButton1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTable jTable1;
/** Creates new form AuditPanel */
public AuditPanel() {
public void renderPanel(){
initComponents();
public String[] getAcceptenceOptions(){
return acceptenceOptions;
public void setAcceptenceOptions(String[] acceptenceOptions){
this.acceptenceOptions = acceptenceOptions;
public Vector getColumnNames(){
return colNames;
public void setColumnNames(Vector colNames){
this.colNames = colNames;
public Vector getData(){
Vector dataVector = new Vector();
/*dataVector.add(null);
dataVector.add(null);
dataVector.add(null);
return dataVector;
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
jPanel2 = new javax.swing.JPanel();
jButton1 = new javax.swing.JButton();
jButton2 = new javax.swing.JButton();
jPanel1 = new javax.swing.JPanel();
jTable1 = new javax.swing.JTable();
setLayout(new java.awt.GridBagLayout());
setBorder(new javax.swing.border.EmptyBorder(0,0,0,0));
jPanel2.setLayout(new java.awt.GridBagLayout());
jPanel2.setBorder(new javax.swing.border.EmptyBorder(0,0,0,0));
jButton1.setText("Add");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.ipadx = 8;
gridBagConstraints.insets = new java.awt.Insets(0, 1, 5, 0);
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
jPanel2.add(jButton1, gridBagConstraints);
jButton2.setText("Delete");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
jPanel2.add(jButton2, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 0;
gridBagConstraints.insets = new java.awt.Insets(0, 5, 0, 0);
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH;
add(jPanel2, gridBagConstraints);
jPanel1.setLayout(new java.awt.GridBagLayout());
jPanel1.setBorder(new javax.swing.border.BevelBorder(javax.swing.border.BevelBorder.LOWERED, Color.black, Color.gray) );
jTable1.setModel(new javax.swing.table.DefaultTableModel(getData(), getColumnNames()));
// get all the columns and set the column required properties
java.util.Enumeration enum = jTable1.getColumnModel().getColumns();
while (enum.hasMoreElements()) {
TableColumn column = (TableColumn)enum.nextElement();
if( column.getModelIndex() == 0 ) {
column.setPreferredWidth(column0Width);
column.setCellEditor( new ValidateCellDataEditor(true) );
if( column.getModelIndex() == 1) {
column.setPreferredWidth(column1Width);
column.setCellEditor(new AcceptenceComboBoxEditor(getAcceptenceOptions()));
// If the cell should appear like a combobox in its
// non-editing state, also set the combobox renderer
//column.setCellRenderer(new AcceptenceComboBoxRenderer(getAcceptenceOptions()));
if( column.getModelIndex() == 2 ) {
column.setPreferredWidth(column2Width); // width of column
column.setCellEditor( new ValidateCellDataEditor(false) );
jScrollPane1 = new javax.swing.JScrollPane(jTable1);
jScrollPane1.setPreferredSize(new java.awt.Dimension(480, 280));
jTable1.setMinimumSize(new java.awt.Dimension(60, 70));
//jTable1.setPreferredSize(new java.awt.Dimension(300, 70));
//jScrollPane1.setViewportView(jTable1);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH;
jPanel1.add(jScrollPane1, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
add(jPanel1, gridBagConstraints);
// set the row height
jTable1.setRowHeight(rowHeight);
// set selection color
jTable1.setSelectionBackground(rowSelectionBackground);
// set the single selection
jTable1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
// avoid table header to resize/ rearrange
jTable1.getTableHeader().setReorderingAllowed(false);
jTable1.getTableHeader().setResizingAllowed(false);
// Table header font
jTable1.getTableHeader().setFont( new Font( jTable1.getFont().getName(),Font.BOLD,jTable1.getFont().getSize() ) );
jButton1.setMnemonic(KeyEvent.VK_A);
// action of add button
jButton1.addActionListener( new ActionListener(){
public void actionPerformed(ActionEvent actionEvent){
// If a button press is the trigger to leave a JTable cell and save the data in model
if(jTable1.isEditing() ){
//System.out.println("table is edition ");
String text=((javax.swing.text.JTextComponent)jTable1.getEditorComponent()).getText();
jTable1.setValueAt(text,jTable1.getSelectedRow(),jTable1.getSelectedColumn()) ;
jTable1.getCellEditor().cancelCellEditing();
// find out total available rows
int totalRows = jTable1.getRowCount();
int cols = jTable1.getModel().getColumnCount();
if( jTable1.getModel() instanceof DefaultTableModel ) {
((DefaultTableModel)jTable1.getModel()).addRow(new Object[cols]);
int newRowCount = jTable1.getRowCount();
// select the first row
jTable1.getSelectionModel().setSelectionInterval(newRowCount-1,newRowCount-1);
jButton2.setMnemonic(KeyEvent.VK_D);
// action of Delete button
jButton2.addActionListener( new ActionListener(){
public void actionPerformed(ActionEvent actionEvent){
int totalRows = jTable1.getRowCount();
// If there are more than one row in table then delete it
if( totalRows > 0){
int selectedOption = JOptionPane.showConfirmDialog(null,"Are you sure you want to delete this audit row?","Coeus", JOptionPane.YES_NO_OPTION);
// if Yes then selectedOption is 0
// if No then selectedOption is 1
if(0 == selectedOption ){
// get the selected row
int selectedRow = jTable1.getSelectedRow();
System.out.println("Selected Row "+selectedRow);
if( selectedRow != -1 ){
DefaultTableModel dm= (DefaultTableModel)jTable1.getModel();
java.util.Vector v1=dm.getDataVector();
System.out.println("BEFOE "+v1);
v1.remove(selectedRow);
jTable1.removeRowSelectionInterval(selectedRow,selectedRow);
System.out.println("After "+v1);
}else{
// show the error message
JOptionPane.showMessageDialog(null, "Please Select an audit Row", "Coeus", JOptionPane.ERROR_MESSAGE);
} // end of initcomponents
class AcceptenceComboBoxRenderer extends JComboBox implements TableCellRenderer {
public AcceptenceComboBoxRenderer(String[] items) {
super(items);
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
if (isSelected) {
setForeground(table.getSelectionForeground());
super.setBackground(rowSelectionBackground);
} else {
setForeground(table.getForeground());
setBackground(table.getBackground());
// Select the current value
setSelectedItem(value);
return this;
class AcceptenceComboBoxEditor extends DefaultCellEditor {
public AcceptenceComboBoxEditor(String[] items) {
super(new JComboBox(items));
} // end editor class
public class ValidateCellDataEditor extends AbstractCellEditor implements TableCellEditor {
// This is the component that will handle the editing of the
// cell value
JComponent component = new JTextField();
boolean validate;
public ValidateCellDataEditor(boolean validate){
this.validate = validate;
// This method is called when a cell value is edited by the user.
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int rowIndex, int vColIndex) {
if (isSelected) {
component.setBackground(rowSelectionBackground);
// Configure the component with the specified value
JTextField tfield =(JTextField)component;
// if any vaidations to be done for this cell
if(validate){
//tfield.setDocument(new JTextFieldFilter(JTextFieldFilter.NUMERIC,4));
tfield.setText( ((String)value));
// Return the configured component
return component;
// This method is called when editing is completed.
// It must return the new value to be stored in the cell.
public Object getCellEditorValue() {
return ((JTextField)component).getText();
// This method is called just before the cell value
// is saved. If the value is not valid, false should be returned.
public boolean stopCellEditing() {
String s = (String)getCellEditorValue();
return super.stopCellEditing();
public void itemStateChanged(ItemEvent e) {
super.fireEditingStopped();
}//end of ValidateCellDataEditor class
public static void main(String args[]){
JFrame frame = new JFrame();
AuditPanel auditPanel = new AuditPanel();
frame.getContentPane().add(auditPanel);
auditPanel.setAcceptenceOptions(new String[]{"Accepted", "Rejected", "Requested"} );
java.util.Vector colVector = new java.util.Vector();
colVector.add("Fiscal Year");
colVector.add("Audit Accepted");
colVector.add("Comment" );
auditPanel.setColumnNames( colVector);
auditPanel.renderPanel();
frame.pack();
frame.show();Hi,
I've got the solution for it. As when the cursor is in cell of
a row and hit the delete button, the data in that cell is not saved,
So i'm trying to save the data first into the model then firing the action event by doing this ..
jButton2.addActionListener( new ActionListener(){
public void actionPerformed(ActionEvent actionEvent){
// If a button press is the trigger to leave a JTable cell and save the data in model
if(jTable1.isEditing() ){
String text=((javax.swing.text.JTextComponent)jTable1.getEditorComponent()).getText();
jTable1.setValueAt(text,jTable1.getSelectedRow(),jTable1.getSelectedColumn()) ;
jTable1.getCellEditor().cancelCellEditing();
// HERE DO THE DELETE ROW OPERATION
<yaman/>
Maybe you are looking for
-
How to Send Purchase Order through EDI/IDOC.
Hi Experts, We are using SAP ECC.5. And intending to send the Purchase Order to Supplier through EDI/IDOC and Receive the Inbound Acknowledgement. Appreciate, if you could help me, the required Configuration details for outbound and inbound (PO & Ack
-
Trying to change solid white to transparent in a black to white gradient in one layer of a psd file
Hi everyone I have a multilayered psd file. All layers should remain opaque except the black to white gradient layer where I need the white to be transparent. So that when I oplace the final psd on top of a block of solid colour in Indesign the gradi
-
What platform/java technology should I use? Please Help
Hi, I am a uni student and have a final year java project to do. The project must include: 1. a server side application that must run at specific times during the day (3 x a day) and store information to a database (MySQL). 2. a client side desktop a
-
Anyone who has the same problem and idea how I can fix this?
-
Bootstrapping Error:ALC-TTN-100-004
Hi, I downloaded "JBoss_EFGJ_DVD_Beta6" and then i installed Adobe Livecycle Reader Extension(manual installation). In "Livecycle ES Database initialization" stage following error has occured. Bootstrapping Error:ALC-TTN-100-004 Failed on retreiving