From: <ast...@gm...> - 2007-04-27 04:15:55
|
I am trying to convert a custom ListModel from http://www.jguru.com/faq/view.jsp?EID=15245 It looks like this, more or less: public class SortingListModel extends AbstractListModel { TreeSet model; // private static COMPARATOR here public SortingListModel() { model = new TreeSet(COMPARATOR); } public int getSize() { return model.size(); } public Object getElementAt( int index ) { return model.toArray()[index]; } public void addElement( Object element ) { if( model.add( element )) { fireContentsChanged( this, 0, getSize() ); } } // More lines follow... } I've "translated" it into Jython as below: class SortingListModel(swing.AbstractListModel): def __init__(self): self.model = util.TreeSet(CustomComparator()) def getSize(self): return self.model.size() def getElementAt(self, index): return self.model.toArray()[index] def addElement(self, element): if self.model.add(element): self.fireContentsChanged(self, 0, self.getSize()) # More lines follow... My questions are: 1. In the second line of the Java code, where it declares "TreeSet model;", how do I convert that in Jython? Should it be: class SortingListModel(...): model = util.TreeSet() def __init__(self): Or is what I am doing right now correct? 2. For the "public SortingListModel()" declaration, do I need to create a similar "def SortingListModel():"? The reasons for my questions are because when I tried to use this SortListModel(), I keep getting ConcurrentModificationException especially when dealing with a lot of add/remove of elements that occur very quickly. I'm wondering if the wrong translation contributes to this error. However, I've read an article at http://www-128.ibm.com/developerworks/java/library/j-jtp07233.html and some forum postings, that a ConcurrentModificationException can be avoided by using Collections.synchronizedList() but then it also says that "The result is that while these programs appear to work under light load, under heavy load they may start throwing NullPointerException or ConcurrentModificationException." Also, if I decide to use this, how do I use this with the ListModel()? The API shows only lists and sets. This brings me to other questions: 1. How do I avoid that exception?, and 2. How do I use CopyOnWriteArrayList in a ListModel() such as the one above? Sorry for the lengthy email. I don't know where else to ask. Thanks for reading. And even more thanks if there are replies... P.S. Are there any jython forums besides the one in nabble? That one's virtually the same as this mailing list.. |
From: Jeff E. <jem...@fr...> - 2007-04-27 04:55:12
|
For Q 1 & 2, your translation looks good as it is. Your getElementAt implementation is very expensive (in both Java and Jython). It copies the entire set every time the method is called, which will be frequently. ConcurrentModification can occur if you modify the collection while iterating over it. That doesn't occur in the code you've shown unless it is being accessed from multiple threads. You can use Collections.synchronizedSet to help with thread safety, like this: set = util.TreeSet(CustomComparator()) self.model = util.Collections.synchronizedSet(set) ast...@gm... wrote: > I am trying to convert a custom ListModel from > http://www.jguru.com/faq/view.jsp?EID=15245 > > It looks like this, more or less: > > public class SortingListModel extends AbstractListModel { > TreeSet model; > // private static COMPARATOR here > public SortingListModel() { model = new TreeSet(COMPARATOR); } > public int getSize() { return model.size(); } > public Object getElementAt( int index ) { return model.toArray()[index]; } > public void addElement( Object element ) { > if( model.add( element )) { > fireContentsChanged( this, 0, getSize() ); > } > } > // More lines follow... > } > > I've "translated" it into Jython as below: > > class SortingListModel(swing.AbstractListModel): > def __init__(self): > self.model = util.TreeSet(CustomComparator()) > def getSize(self): > return self.model.size() > def getElementAt(self, index): > return self.model.toArray()[index] > def addElement(self, element): > if self.model.add(element): > self.fireContentsChanged(self, 0, self.getSize()) > # More lines follow... > > My questions are: > > 1. In the second line of the Java code, where it declares "TreeSet > model;", how do I convert that in Jython? Should it be: > > class SortingListModel(...): > model = util.TreeSet() > def __init__(self): > > Or is what I am doing right now correct? > > 2. For the "public SortingListModel()" declaration, do I need to > create a similar "def SortingListModel():"? > > The reasons for my questions are because when I tried to use this > SortListModel(), I keep getting ConcurrentModificationException > especially when dealing with a lot of add/remove of elements that > occur very quickly. I'm wondering if the wrong translation contributes > to this error. > > However, I've read an article at > http://www-128.ibm.com/developerworks/java/library/j-jtp07233.html and > some forum postings, that a ConcurrentModificationException can be > avoided by using Collections.synchronizedList() but then it also says > that "The result is that while these programs appear to work under > light load, under heavy load they may start throwing > NullPointerException or ConcurrentModificationException." Also, if I > decide to use this, how do I use this with the ListModel()? The API > shows only lists and sets. > > This brings me to other questions: > > 1. How do I avoid that exception?, and > 2. How do I use CopyOnWriteArrayList in a ListModel() such as the one above? > > Sorry for the lengthy email. I don't know where else to ask. > > Thanks for reading. And even more thanks if there are replies... > > P.S. Are there any jython forums besides the one in nabble? That one's > virtually the same as this mailing list.. > > ------------------------------------------------------------------------- > This SF.net email is sponsored by DB2 Express > Download DB2 Express C - the FREE version of DB2 express and take > control of your XML. No limits. Just data. Click to get it now. > http://sourceforge.net/powerbar/db2/ > _______________________________________________ > Jython-users mailing list > Jyt...@li... > https://lists.sourceforge.net/lists/listinfo/jython-users |