Making a table column editable at runtime

I have tried:

if event.source.selected == 1:
	event.source.buttonBG = (0,217,0)
	table = event.source.parent.getComponent("loadData").columnAttributesData
	newData = system.dataset.setValue(table, 0, 27, 1)
	newData1 = system.dataset.setValue(newData, 1, 27, 1)
	event.source.parent.getComponent("loadData").columnAttributesData = newData1
else:
	event.source.buttonBG = (238,236,232)
	table = event.source.parent.getComponent("loadData").columnAttributesData
	newData = system.dataset.setValue(table, 0, 27, 0)
	newData1 = system.dataset.setValue(newData, 1, 27, 0)
	event.source.parent.getComponent("loadData").columnAttributesData = newData1

I have added the above code in a button event handler for click. Gives the following error only when the button is “selected”, never toggles the table being editable, and freezes up part of the screen until I click the button again:

com.inductiveautomation.ignition.client.util.gui.table.SortTableModel$SorterTableCellRenderer.getTableCellRendererComponent(SortTableModel.java:554)
at javax.swing.plaf.basic.BasicTableHeaderUI.getHeaderRenderer(Unknown Source)
at javax.swing.plaf.basic.BasicTableHeaderUI.paintCell(Unknown Source)
at javax.swing.plaf.basic.BasicTableHeaderUI.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.paintToOffscreen(Unknown Source)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Unknown Source)
at javax.swing.RepaintManager$PaintManager.paint(Unknown Source)
at javax.swing.RepaintManager.paint(Unknown Source)
at javax.swing.JComponent._paintImmediately(Unknown Source)
at javax.swing.JComponent.paintImmediately(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.seqPaintDirtyRegions(Unknown Source)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(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)

All I want to do is make my entire table editable/uneditable at runtime by clicking a button. Can anyone offer any help?

To add some additional information, I used the following code to test the behavior:

if event.source.selected == 1:
	event.source.buttonBG = (0,217,0)
	table = event.source.parent.getComponent("loadData").columnAttributesData
	newData = system.dataset.setValue(event.source.parent.getComponent("loadData").columnAttributesData, 0, 27, 1)
	print "editable:"+str(newData.getValueAt(0,27))
	newData1 = system.dataset.setValue(newData, 1, 27, 1)
	print "editable0:"+str(newData1.getValueAt(0,27))
	print "editable1:"+str(newData1.getValueAt(1,27))
	table = newData1
else:
	event.source.buttonBG = (238,236,232)
	table = event.source.parent.getComponent("loadData").columnAttributesData
	newData = system.dataset.setValue(event.source.parent.getComponent("loadData").columnAttributesData, 0, 27, 0)
	print "editable:"+str(newData.getValueAt(0,27))
	newData1 = system.dataset.setValue(newData, 1, 27, 0)
	print "editable0:"+str(newData1.getValueAt(0,27))
	print "editable1:"+str(newData1.getValueAt(1,27))
	table = newData1

And got the following when I click the button “selected” and then “deselected”:

editable:1
editable0:1
editable1:1
editable:0
editable0:0
editable1:0

Looks like the new dataset with the set values are successful, but not being written to the actual table object in the window. I also tried using:

event.source.parent.getComponent("loadData").columnAttributesData = newData1

but this is when I get the Java error as follows:

Exception in thread “AWT-EventQueue-0” java.lang.IllegalArgumentException: horizontalAlignment
at javax.swing.JLabel.checkHorizontalKey(Unknown Source)
at javax.swing.JLabel.setHorizontalAlignment(Unknown Source)
at com.inductiveautomation.ignition.client.util.gui.table.SortTableModel$SorterTableCellRenderer.getTableCellRendererComponent(SortTableModel.java:554)
at javax.swing.plaf.basic.BasicTableHeaderUI.getHeaderRenderer(Unknown Source)
at javax.swing.plaf.basic.BasicTableHeaderUI.getHeaderHeight(Unknown Source)
at javax.swing.plaf.basic.BasicTableHeaderUI.createHeaderSize(Unknown Source)
at javax.swing.plaf.basic.BasicTableHeaderUI.getPreferredSize(Unknown Source)
at javax.swing.JComponent.getPreferredSize(Unknown Source)
at javax.swing.ViewportLayout.preferredLayoutSize(Unknown Source)
at java.awt.Container.preferredSize(Unknown Source)
at java.awt.Container.getPreferredSize(Unknown Source)
at javax.swing.JComponent.getPreferredSize(Unknown Source)
at javax.swing.ScrollPaneLayout.layoutContainer(Unknown Source)
at java.awt.Container.layout(Unknown Source)
at java.awt.Container.doLayout(Unknown Source)
at java.awt.Container.validateTree(Unknown Source)
at java.awt.Container.validate(Unknown Source)
at javax.swing.RepaintManager.validateInvalidComponents(Unknown Source)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(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)

Those are some strange errors that I couldn’t reproduce. Just to be clear, you were using the “standard” button component, correct? If so, it is a better idea to just use actionPerformed instead of dealing with mouse clicks, it’s more compatible with all situations, especially when using touch screens.

This snippet of code was able to toggle column editing on each button press:

[code]table = event.source.parent.getComponent(‘Table’)
ca_data = table.columnAttributesData

if ca_data.getValueAt(0,26):
new_data = system.dataset.setValue(ca_data, 0, 26, False)
else:
new_data = system.dataset.setValue(ca_data, 0, 26, True)

table.columnAttributesData = new_data[/code]

Hey Folks!
I found an easiest way to update Attributes Data.
First clear the Table and after add rows to it… :blush: