I don't know what gwt-fabridge is, but maybe that project has it's own support list you can use for issues such as this? Not sure you will get much response here.
On Feb 3, 4:00 pm, "Jihong Liu" <jihong....@satmetrix.com> wrote: > Hi. I have a problem for gwt-fabridge. I think it may be a critical > issue for gwt-fabridge. > > If a swf widget is added into a panel, and then add the panel into a > container. And then remove the panel from the container, and then add > the panel back into the container. Then the Null pointer error will > occur at onInitialization()caused by the swf widget. I did a test using > the FABridgeDemo. In the FABridgeDemo, I added a button for removing the > swf widget. > > When start the program, first click the "Add new SWF", and everything is > ok. Then click the "Remove SWF", then the swf is removed. Then click the > "Add new SWF" again, then an error will happen. > > I have tried many ways, the only way to make it work is to create the > swf widge again and using a different name if the widget has been > removed. For example: > > java.util.Date date = new java.util.Date(); > > swfWidget = new > SWFABridgeWidget("app.swf",400,400,"example"+date.getTime()); > > But it is not good at all. And the behavior is not the same as other > regular gwt widgets. For other widgets, after they are put in a panel. > Then you can add/drop this panel into/from a container many times > without re-create the inside widgets. > > I am really frustrated about this problem. Based on user's selection we > will add different panels into a container for display. It is really > painful if we have to create the swf widgets again if the panel has been > dropped from the container once. > > I don't know whether the following code in > pl.rmalinowski.gwt2swf.client.ui.SWFWidge causes problem or not. > > protected void onUnload() { > > // GWT.log("onUnload", null); > > getElement().removeChild(DOM.getFirstChild(getElement())); > > isSWFInjected = false; > > super.onUnload(); > > } > > The statement: getElement().removeChild(DOM.getFirstChild(getElement())) > removes the child from the widget. Thus after a swfwidget is removed > from a panel, and then add the swf back, no child there. > > Following is the code in com.google.gwt.user.client.ui.ComplexPanel > > @Override > > public boolean remove(Widget w) { > > // Validate. > > if (w.getParent() != this) { > > return false; > > } > > // Orphan. > > orphan(w); > > // Physical detach. > > Element elem = w.getElement(); > > DOM.removeChild(DOM.getParent(elem), elem); > > // Logical detach. > > getChildren().remove(w); > > return true; > > } > > It sounds to me that the different between two programs is that in > ComplexPanel, it removes the widget's element only, but in SWFWidge, it > removes the child of the widget's element. > > Thank you very much! > > Jihong Liu > > Following is the source code which causes problem > > package com.satmetrix.swfTest.client; > > import org.argunet.gwt.fabridge.client.SWFABridgeWidget; > > import org.argunet.gwt.fabridge.client.bridge.BridgeObject; > > import org.argunet.gwt.fabridge.client.bridge.BridgeParameter; > > import org.argunet.gwt.fabridge.client.bridge.BridgeParameterObject; > > import org.argunet.gwt.fabridge.client.events.IInitializationListener; > > import org.argunet.gwt.fabridge.client.events.ISWFListener; > > import org.argunet.gwt.fabridge.client.utils.JSNIUtils; > > import com.google.gwt.core.client.EntryPoint; > > import com.google.gwt.core.client.JavaScriptObject; > > import com.google.gwt.user.client.Window; > > import com.google.gwt.user.client.ui.Button; > > import com.google.gwt.user.client.ui.ClickListener; > > import com.google.gwt.user.client.ui.Label; > > import com.google.gwt.user.client.ui.RootPanel; > > import com.google.gwt.user.client.ui.Widget; > > public class FABridgeDemo implements EntryPoint, IInitializationListener > { > > private final Button addNewSwf = new Button("Add new SWF"); > > private final Button removeSwf = new Button("Remove SWF"); > > private final Button setCheckBox = new Button("Set Checkbox > property"); > > private final Label sliderLabel = new Label("Slider Label"); > > private SWFABridgeWidget swfWidget=null; > > private final Button createDataGrid = new Button("Create Data > Grid"); > > /** > > * This is the entry point method. > > */ > > public void onModuleLoad() { > > RootPanel.get().add(addNewSwf); > > RootPanel.get().add(removeSwf); > > RootPanel.get().add(setCheckBox); > > RootPanel.get().add(sliderLabel); > > RootPanel.get().add(createDataGrid); > > // adds new swfWidget to rootPanel > > addNewSwf.addClickListener(new ClickListener() { > > public void onClick(Widget arg0) { > > // set bridge name for FABridge > > if (swfWidget==null) { > > swfWidget = new > SWFABridgeWidget("app.swf",400,400,"example"); > > // add initialization listener > > swfWidget.addInitializationListener(FABridgeDemo.this); > > } > > // add swfWidget to RootPanel > > RootPanel.get().add(swfWidget); > > //show swf movie > > swfWidget.show(); > > } > > }); > > removeSwf.addClickListener(new ClickListener() { > > public void onClick(Widget arg0) { > > RootPanel.get().remove(swfWidget); > > } > > }); > > // changes checkbox status in swfWidget > > setCheckBox.addClickListener(new ClickListener() { > > public void onClick(Widget arg0) { > > // get check box > > BridgeObject check = > swfWidget.root().getObject("check"); > > // get check box status > > Boolean status = new > Boolean(check.getProperty("selected").getContent().toString()); > > // change check box status > > check.setProperty("selected", > !status.booleanValue()); > > } > > }); > > // creates new DataGrid in swfWidget > > createDataGrid.addClickListener(new ClickListener() { > > public void onClick(Widget arg0) { > > BridgeObject flexApp = swfWidget.root(); > > // create new data grid > > BridgeObject grid = > swfWidget.create("mx.controls.DataGrid"); > > grid.addRef(); > > // create first column > > BridgeObject col1 = > swfWidget.create("mx.controls.dataGridClasses.DataGridColumn"); > > col1.addRef(); > > col1.setProperty("dataField", "apples"); > > // create second column > > BridgeObject col2 = > swfWidget.create("mx.controls.dataGridClasses.DataGridColumn"); > > col2.addRef(); > > col2.setProperty("dataField", "oranges"); > > // add columns to data grid > > JavaScriptObject jsArray = JSNIUtils > > .convertArray(new JavaScriptObject[] > { > > col1.getJSContent(), > col2.getJSContent() }); > > grid.setProperty("columns", jsArray); > > grid.setProperty("width", 300); > > // create first row > > BridgeParameterObject row1 = new > BridgeParameterObject(); > > row1.addProperty("apples", 12); > > row1.addProperty("oranges", 32); > > // create second row > > BridgeParameterObject row2 = new > BridgeParameterObject(); > > row2.addProperty("apples", 15); > > row2.addProperty("oranges", 24); > > // set dataProvider > > grid.setProperty("dataProvider", JSNIUtils > > .convertArray(new JavaScriptObject[] > { > > row1.getObject(), > row2.getObject() })); > > // add grid to panel > > BridgeParameter params = new BridgeParameter(); > > params.addParameter(grid.getJSContent()); > > flexApp.getObject("panel").invokeMethod("addChild",params.getParameter() > ); > > } > > }); > > } > > /** > > * Gets called after the swf has been initalized. > > */ > > public void onInitialization() { > > // get width of the swf > > Object width = > swfWidget.root().getProperty("width").getContent(); > > Integer test = new Integer(width.toString()); > > Window.alert("Swf Initialized. Width: " + test); > > // add click listener to flex button > > swfWidget.root().getObject("button").addEventListener("click", > > new ISWFListener() { > > public void onSWFEvent(JavaScriptObject > event) { > > Window.alert("Hello, GWT! Love, > Actionscript..."); > > } > > }); > > // add change listener to flex slider > > swfWidget.root().getObject("slider").addEventListener("change", > > new ISWFListener() { > > public void onSWFEvent(JavaScriptObject > event) { > > // wrap event object into bridge > object > > BridgeObject e = new > BridgeObject(event); > > // get slider value from event > object > > sliderLabel.setText(e.getProperty("value").getContent().toString()); > > } > > }); > > } > > } --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Google Web Toolkit" group. To post to this group, send email to Google-Web-Toolkit@googlegroups.com To unsubscribe from this group, send email to google-web-toolkit+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/Google-Web-Toolkit?hl=en -~----------~----~----~----~------~----~------~--~---