From: Karl S. <sc...@ye...> - 2002-09-17 10:20:30
|
Hello everybody, I would like to have a swing-ComboBoxModel written in Jython. For that reason, I need my Model extending AbstractListModel and implementing ComboBoxModel, if I understand it correctly. <code-snipplet> class MyComboModel (swing.AbstractListModel, swing.ComboBoxModel): def __init__(self): swing.AbstractListModel.__init__(self) self.addListDataListener(None) # use None, just to verify if method can be found </code-snipplet> results in: AttributeError: abstract method "addListDataListener" not implemented (but that's one reason of AbstractListModel to provide for listeners) Funny, if deriving only from AbstractListModel but not from ComboBoxModel the method can be found as expected. I would appreciate any help very much, best regards, Karl Scalet |
From: Karl S. <sc...@ye...> - 2002-09-17 12:23:14
|
Originally myself wrote: > <code-snipplet> > class MyComboModel (swing.AbstractListModel, swing.ComboBoxModel): > def __init__(self): > swing.AbstractListModel.__init__(self) > self.addListDataListener(None) # use None, just to verify if > method can be found > </code-snipplet> > If I write an empty "adapter class" in Java like: public abstract class AdapList extends AbstractListModel implements ComboBoxModel { } and derive from this in MyComboModel, it works fine. Hence, this is a workaraound I can life with, though wondering why the first approach of directly using an abstract class and an interface in my Jython class did _not_ work. Karl |
From: Finn B. <bc...@wo...> - 2002-09-17 14:40:40
|
[Karl Scalet] > Originally myself wrote: > >> <code-snipplet> >> class MyComboModel (swing.AbstractListModel, swing.ComboBoxModel): >> def __init__(self): >> swing.AbstractListModel.__init__(self) >> self.addListDataListener(None) # use None, just to verify if >> method can be found >> </code-snipplet> >> > > If I write an empty "adapter class" in Java like: > > public abstract class AdapList > extends AbstractListModel > implements ComboBoxModel { > } > > and derive from this in MyComboModel, it works fine. > > Hence, this is a workaraound I can life with, though wondering why the > first approach of directly > using an abstract class and an interface in my > Jython class did _not_ work. Short explanation: It is a bug in jython. Longer explanation: When inheriting from an interface, jython's ProxyMaker dynamicly creates an implementation for each method found in the interface (and other abstract methods) along the lines of: public void addListModelListener(ListModelListener arg0) { PyObject inst = Py.jgetattr(this, "addListDataListener"); inst._jcall(new Object[] {arg0}); } this will ensure that an implementation for addListDataListener in python will be called whenever the method is called from java. Such a definition of an abstract method should not happen if there already exists a real implementation of the method somewhere in the superclasses. But unfortunately, ProxyMaker checked for methods in the interfaces before checking for methods in the superclass. So this bug is tickled when an interface listed as a base class defines a method that is implemented in the real java superclass. I have opened bug 610576 about it. regards, finn |