Listeners can be removed by calling the remove() method on the listener list, similar to Swing and WPF.
On Dec 30, 2009, at 9:26 PM, Michael Bushe wrote: > Greg, > > How/when can event listeners be removed (to avoid "memory leaks"/"loitering > objects")? Flex has a robust component lifecycle, I don't remember Pivot > having a component lifecycle model at all (and neither does Swing, except > for Window, you have to bolt it on yourself). I think I'd rather see the > whole model at once, I suppose in 1.5. > > I'm a HUGE fan of what you are trying to do, but maybe it should wait? > OTOH, you know you are going to have initialize(), maybe that's a good > start. On the third hand, if you add preInitialize() later (like Flex), > then existing initialize() calls aren't broken exactly, but when things > happen may shift and be a surprise. > > Michael Bushe > Software Architect/Developer > [email protected] > www.bushe.com > > > On Wed, Dec 30, 2009 at 9:14 PM, Greg Brown <[email protected]> wrote: > >> FYI, though it wasn't mentioned in the commit message, this change also >> included a minor addition/change to the org.apache.pivot.wtkx package. This >> change is relatively insubstantial but should actually have a significant >> impact on "real" application development. >> >> Some background: In Flex, MXML files are compiled to classes. So, this file >> generates a class named MyVBox: >> >> MyVBox.mxml: >> >> <mx:VBox initialize="onInitialize()" >> xmlns:mx="http://www.adobe.com/2006/mxml"> >> <mx:Script> >> public function onInitialize():void { >> // Wire up event handlers, etc. >> } >> >> public function onMyButtonClick():void { >> // Respond to button click >> } >> </mx:Script> >> >> <mx:Button id="myButton" label="Click Me" click="onMyButtonClick()"/> >> </mx:VBox> >> >> I can then use that class as a component in other MXML files (for example, >> I could add it to a tab pane, or "TabNavigator" in Flex). >> >> In Pivot, something similar could be done with the following WTKX: >> >> my_box_pane.wtkx: >> >> <BoxPane orientation="vertical" >> xmlns:wtkx="http://pivot.apache.org/wtkx" >> xmlns="org.apache.pivot.wtk"> >> <wtkx:script> >> function myButtonClicked() { >> // Respond to button click >> } >> </wtkx:script> >> >> <PushButton wtkx:id="myButton" buttonData="Click Me" >> ButtonPressListener.buttonPressed="myButtonClicked()"/> >> </BoxPane> >> >> We can then include my_box_pane.wtkx into a TabPane declared in another >> WTKX file. However, Pivot didn't have an equivalent of onInitialize(). If >> the root element is a Window, we could listen for windowOpened(), but >> otherwise we're stuck. >> >> Also, it becomes more complex when we want to associate Java code with WTKX >> includes, rather than putting the logic in script. This is something any >> non-trivial application is going to want to do, and Pivot didn't provide an >> easy way to do it. The change I checked in attempts to solve these two >> problems. We can't use WTKX to define new classes, but we can use WTKX to >> instantiate classes we have defined elsewhere. For example: >> >> MyBoxPane.java: >> >> public class MyBoxPane extends BoxPane implements Bindable { >> @WTKX private PushButton myButton = null; >> >> public MyBoxPane() { >> super(Orientation.VERTICAL); >> } >> >> @Override >> public void initialize() { >> myButton.getButtonPressListeners().add(new ButtonPressListener() >> { >> public void buttonPressed(Button button) { >> // Respond to button click >> } >> }); >> } >> } >> >> Using this approach, the updated my_box_pane.wtkx would look like this: >> >> my_box_pane.wtkx: >> >> <foo:MyBoxPane orientation="vertical" >> xmlns:wtkx="http://pivot.apache.org/wtkx" >> xmlns:foo="com.foo" >> xmlns="org.apache.pivot.wtk"> >> <PushButton wtkx:id="myButton" buttonData="Click Me"/> >> </foo:MyBoxPane> >> >> Once WTKXSerializer is done processing foo:MyBoxPane, it sees that it >> implements Bindable and bind()s to it. It then calls initialize() to allow >> the class to register event listeners and perform any other required >> initialization tasks. >> >> This is a late-breaking change for 1.4, so please let me know ASAP if you >> have any questions or concerns. >> >> G >> >>
