Description
After an applet is supposedly destroyed, it's init () and start () methods are called again when in fact they should not be called again.
I reproduced this with gwt and no smartgwt in the picture, but I am posting anyway in case somebody has a workaround?
Use case:
1. Create a Tab
2. Add an applet
3. Applet's init () and start () methods are called, as expected
4. Close the tab via tabSet.remove ()
5. Applet's stop () and destory () methods are called, as expected
6. Applet's init () and start () methods are called again, NOT as expected
Not only that, when init () is called, it contains the same applet parameters specified in #1.
Note that in Chrome, this works fine, meaning that the applet's init () and start () methods are not called again, and the applet object seems to be gone from the Java console...
1. the SmartGWT or SmartClient version and browser version(s) involved;
SmartGWT 2.3-2010-10-05 and 2.3-2010-12-05
GWT 2.0.3
Does not work in IE 6, IE 7, and IE 8
Works fine in Chrome 8.0.552.224
I reproduced this with simple GWT code and so I do not think this is a SmartGWT issue, but I figured I'd ask and see if anybody has any advice.
Here is the GWT groups thread I started:
http://groups.google.com/group/googl...33ccfbe13c530#
2. for a server-side problem, the complete logs generated during processing of the request;
DNA
3. for a client-side problem, the contents of the Developer Console (see FAQ for usage);
DNA
4. if there is a JavaScript error, the stack trace logged in the Developer Console (from Internet Explorer if possible); and
DNA
5. sample code.
Stand-alone case (GWT)
Stand-alone case (SmartGWT)
Applet:
GWT Console Logging
Java Console Logging
Posts with incomplete information are much more likely to be ignored.
After an applet is supposedly destroyed, it's init () and start () methods are called again when in fact they should not be called again.
I reproduced this with gwt and no smartgwt in the picture, but I am posting anyway in case somebody has a workaround?
Use case:
1. Create a Tab
2. Add an applet
3. Applet's init () and start () methods are called, as expected
4. Close the tab via tabSet.remove ()
5. Applet's stop () and destory () methods are called, as expected
6. Applet's init () and start () methods are called again, NOT as expected
Not only that, when init () is called, it contains the same applet parameters specified in #1.
Note that in Chrome, this works fine, meaning that the applet's init () and start () methods are not called again, and the applet object seems to be gone from the Java console...
1. the SmartGWT or SmartClient version and browser version(s) involved;
SmartGWT 2.3-2010-10-05 and 2.3-2010-12-05
GWT 2.0.3
Does not work in IE 6, IE 7, and IE 8
Works fine in Chrome 8.0.552.224
I reproduced this with simple GWT code and so I do not think this is a SmartGWT issue, but I figured I'd ask and see if anybody has any advice.
Here is the GWT groups thread I started:
http://groups.google.com/group/googl...33ccfbe13c530#
2. for a server-side problem, the complete logs generated during processing of the request;
DNA
3. for a client-side problem, the contents of the Developer Console (see FAQ for usage);
DNA
4. if there is a JavaScript error, the stack trace logged in the Developer Console (from Internet Explorer if possible); and
DNA
5. sample code.
Stand-alone case (GWT)
Code:
import com.google.gwt.core.client.EntryPoint; import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.ClickListener; import com.google.gwt.user.client.ui.Widget; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.TabPanel; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.HTML; public class TestAppletLifecycleGwt implements EntryPoint { // my variables private int tabNumber = 0; final TabPanel tabPanel = new TabPanel (); /** * The EntryPoint interface */ public void onModuleLoad () { final VerticalPanel verticalPanel = new VerticalPanel (); // Make a new button that does something when you click it. final Button button = new Button ( "Create Tab with Applet", new ClickListener() { public void onClick (final Widget sender) { createTabWithApplet (); } }); verticalPanel.add (button); // add a tabset tabPanel.setWidth ("100%"); tabPanel.setHeight ("100%"); verticalPanel.add (tabPanel); // draw GWT.log ("onModuleLoad (): drawing main Layout", null); RootPanel.get ().add (verticalPanel); } /** * Creates the first tab */ private void createTabWithApplet () { // next tabNumber tabNumber ++; GWT.log ("createTabWithApplet (): adding AND loading tab #" + tabNumber, null); // organize vertically final VerticalPanel verticalPanel = new VerticalPanel (); // add the applet final String htmlCode = getAppletHtmlCode (); GWT.log ("htmlCode: " + htmlCode); final HTML html = new HTML (); html.setHTML (htmlCode); verticalPanel.add (html); // Close button final Button button = new Button ( "Close", new ClickListener() { public void onClick (final Widget sender) { tabPanel.remove (verticalPanel); } }); verticalPanel.add (button); verticalPanel.setWidth ("100%"); verticalPanel.setHeight ("100%"); // add the tab tabPanel.add (verticalPanel, "Tab #" + tabNumber); } /** * Uniformely generates the HTML code to render the applet * @return String */ private String getAppletHtmlCode () { final String appletCode = "org.shortdesktop.portal.applet.server.test.LifecycleTestApplet"; final String appletArchive = "/applet/shortdesktop-applets.jar"; final String appletId = "LifecycleTestApplet"; final String appletAlign = null; String htmlCode = "<applet mayscript='true' " + (appletArchive != null ? "archive='" + appletArchive + "' " : "") + (appletAlign != null ? "align='" + appletAlign + "' " : "") + "code='" + appletCode + "' " + // "width='" + appletConfig.getWidth () + "' " + // "height='" + appletConfig.getHeight () + "' " + "width='" + "100%" + "' " + "height='" + "100%" + "' " + // "name='" + appletConfig.getName () + "' " + "id='" + appletId + "' " + "alt='Java Runtime Environment is not working on your system'" + ">"; htmlCode += "<param name='" + "param1" + "' value='" + "value1" + "'>"; // close htmlCode += "</applet>"; // done return htmlCode; } }
Code:
import com.google.gwt.core.client.EntryPoint; import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.ui.HTML; import com.smartgwt.client.widgets.tab.TabSet; import com.smartgwt.client.widgets.tab.Tab; import com.smartgwt.client.widgets.layout.VLayout; import com.smartgwt.client.widgets.IButton; import com.smartgwt.client.widgets.events.ClickHandler; import com.smartgwt.client.widgets.events.ClickEvent; public class TestAppletLifecycle implements EntryPoint { // my variables private final TabSet tabSet = new TabSet (); private int tabNumber = 0; /** * The EntryPoint interface */ public void onModuleLoad () { // layout final VLayout mainLayout = new VLayout (); mainLayout.setWidth100 (); mainLayout.setHeight100 (); // add a button to add a tab with an applet { final IButton button = new IButton (); button.setAutoFit (true); button.setTitle ("Create Tab with Applet"); button.addClickHandler (new ClickHandler () { public void onClick (final ClickEvent clickEvent) { createTabWithApplet (); } }); mainLayout.addMember (button); } // add a tabset tabSet.setWidth100 (); tabSet.setHeight100 (); mainLayout.addMember (tabSet); // draw GWT.log ("onModuleLoad (): drawing main Layout", null); mainLayout.draw (); } /** * Creates the first tab */ private void createTabWithApplet () { // helpers GWT.log ("createTabWithApplet (): adding AND loading tab #" + tabNumber, null); final VLayout layout = new VLayout (); layout.setWidth100 (); layout.setHeight100 (); // add the applet final String htmlCode = getAppletHtmlCode (); GWT.log ("htmlCode: " + htmlCode); final HTML html = new HTML (); html.setHTML (htmlCode); layout.addMember (html); // add the tab tabNumber ++; final Tab tab = new Tab (); tab.setTitle ("Tab #" + tabNumber); tab.setPane (layout); tab.setCanClose (true); tabSet.addTab (tab); tabSet.selectTab (tab); } /** * Uniformely generates the HTML code to render the applet * @return String */ private String getAppletHtmlCode () { final String appletCode = "LifecycleTestApplet"; final String appletArchive = "/applet.jar"; final String appletId = "LifecycleTestApplet"; final String appletAlign = null; String htmlCode = "<applet mayscript='true' " + (appletArchive != null ? "archive='" + appletArchive + "' " : "") + (appletAlign != null ? "align='" + appletAlign + "' " : "") + "code='" + appletCode + "' " + // "width='" + appletConfig.getWidth () + "' " + // "height='" + appletConfig.getHeight () + "' " + "width='" + "100%" + "' " + "height='" + "100%" + "' " + // "name='" + appletConfig.getName () + "' " + "id='" + appletId + "' " + "alt='Java Runtime Environment is not working on your system'" + ">"; // close htmlCode += "</applet>"; // done return htmlCode; } }
Code:
import java.util.Date; import java.awt.Color; import javax.swing.JApplet; import javax.swing.JPanel; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.JTextField; import javax.swing.border.Border; public class LifecycleTestApplet extends JApplet { // my attributes private JTextField textField; /** * The Applet interface */ @Override public void init () { // helper log ("init ()"); // delegate super.init (); // log param1 final String value1 = getParameter ("param1"); log ("init (): param1=" + value1); // create simple UI final JPanel panel = new JPanel (); final String title = "LifecycleTestApplet"; final Border border = BorderFactory.createTitledBorder (title); panel.setBorder (border); panel.setBackground (Color.WHITE); // add a log lines final Box box = Box.createVerticalBox (); textField = new JTextField (40); textField.setHorizontalAlignment (JTextField.LEFT); textField.setEditable (false); box.add (textField); } /** * The Applet interface */ @Override public void start () { // helper log ("start ()"); // delegate super.start (); } /** * The Applet interface */ @Override public void stop () { // helper log ("stop ()"); // delegate super.stop (); } /** * The Applet interface */ @Override public void destroy () { // helper log ("destroy ()"); // delegate super.destroy (); } /** * Uniformely logs the given message * @param message */ private void log (final String message) { System.out.println ("<" + new Date () + ">"); System.out.println ("<" + toString () + ">"); System.out.println ("<identityHashCode: " + System.identityHashCode (this) + "> "); System.out.println ("<" + message + ">"); if (textField != null) { textField.setText (message); } } }
Code:
00:00:38.719 [INFO] Loading module portal 00:00:43.375 [INFO] onModuleLoad (): drawing main Layout 00:00:43.375 [INFO] onModuleLoad (): drawing main Layout 00:00:43.375 [INFO] onModuleLoad (): drawing main Layout 00:00:51.406 [INFO] htmlCode: <applet mayscript='true' archive='/applet.jar' code='LifecycleTestApplet' width='100%' height='100%' id='LifecycleTestApplet' alt='Java Runtime Environment is not working on your system'><param name='param1' value='value1'></applet>
Code:
<Sun Dec 19 04:53:26 PST 2010> <LifecycleTestApplet[panel0,0,0,0x0,invalid,hidden,layout=java.awt.BorderLayout,rootPane=javax.swing.JRootPane[,0,0,0x0,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true]> <identityHashCode: 16602326> <init ()> <Sun Dec 19 04:53:26 PST 2010> <LifecycleTestApplet[panel0,0,0,0x0,invalid,hidden,layout=java.awt.BorderLayout,rootPane=javax.swing.JRootPane[,0,0,0x0,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true]> <identityHashCode: 16602326> <init (): param1=value1> <Sun Dec 19 04:53:26 PST 2010> <LifecycleTestApplet[panel0,0,0,0x0,layout=java.awt.BorderLayout,rootPane=javax.swing.JRootPane[,0,0,0x0,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true]> <identityHashCode: 16602326> <start ()> <Sun Dec 19 04:53:29 PST 2010> <LifecycleTestApplet[panel0,0,0,235x1,hidden,layout=java.awt.BorderLayout,rootPane=javax.swing.JRootPane[,0,0,235x1,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true]> <identityHashCode: 16602326> <stop ()> <Sun Dec 19 04:53:29 PST 2010> <LifecycleTestApplet[panel0,0,0,235x1,hidden,layout=java.awt.BorderLayout,rootPane=javax.swing.JRootPane[,0,0,235x1,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true]> <identityHashCode: 16602326> <destroy ()> <Sun Dec 19 04:53:29 PST 2010> <LifecycleTestApplet[panel1,0,0,0x0,invalid,hidden,layout=java.awt.BorderLayout,rootPane=javax.swing.JRootPane[,0,0,0x0,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true]> <identityHashCode: 24408544> <init ()> <Sun Dec 19 04:53:29 PST 2010> <LifecycleTestApplet[panel1,0,0,0x0,invalid,hidden,layout=java.awt.BorderLayout,rootPane=javax.swing.JRootPane[,0,0,0x0,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true]> <identityHashCode: 24408544> <init (): param1=value1> <Sun Dec 19 04:53:29 PST 2010> <LifecycleTestApplet[panel1,0,0,0x0,layout=java.awt.BorderLayout,rootPane=javax.swing.JRootPane[,0,0,0x0,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true]> <identityHashCode: 24408544> <start ()>