Re: opening a window from an applet..



Thomas Hawtin wrote:
Frances wrote:

Thomas Hawtin wrote:

Frances wrote:

when you open a window from an applet (I mean JApplet) does that window also have to be an applet? if not then what? JFrame? (public class [class] extends JFrame?) if it's a JFrame instead of an applet does it still have to have init() method? or does it have to have main() method instead? I'm confused about this... can u pls point to where I can read up on this in java.sun.. (a lot of things they explain about applets is very different for JApplets.. and sometimes when they're explaining something about applets I don't know if what they're talking about also applies to JApplets..)
(can I open a swing window from an applet? or does it have to be from a JApplet?)




You have a few choices:

o Open a new browser window with AppletContext.showDocument (which might or might not work). In that case you would have a another applet embedded in the HTML page.

o Open a Frame/JFrame. Which is a frame like any other. Because you have a security manager installed, it'll have a little banner to notify the user that it is not to be trusted. There is no init or main methods in JFrame, and there doesn't need to be. Just create it and call setVisible(true) on it (from the Event Dispatch Thread). You don't even need to extend JFrame except in specialist cases. A problem with this is that you don't know where that applet is and nor do you have much control over z-order.

 o Use JInternalFrames to create an MDI within the applet.

Tom Hawtin



thank you very much.. other problem I have is I don't know what Event-Dispatch Thread is (I saw this for the first time in java.sun, here..
http://java.sun.com/docs/books/tutorial/uiswing/components/applet.html
and well, still tyring to figure it out..


The code on that page looks reasonable.

Essentially the problem is witting multi-threaded code is very difficult. So, in Swing pretty much everything happens on the Event Dispatch Thread (EDT). To check that you are running in the EDT use java.awt.EventQueue.isDispatchThread().

(I'm tyring to open a new window from a JApplet, and, depending on content in the new window, the JApplet that's sup. to open the window can't find the class..


As in the link posted you should be creating components in the EDT. So to open a frame, say, do:

private JFrame frame;

@Override
public void init() {
    try {
        java.awt.EventQueue.invokeAndWait(new Runnable() {
            public void run() {
                openFrame();
            }
        });
    } catch (InterruptedException exc) {
        // Ignore.
    } catch (InvocationTargetException exc) {
        throw new RuntimeException(exc);
    }
}
private static void openFrame() {
    assert java.awt.EventQueue.isDispatchThread();
    if (frame != null) {
        frame = new JFrame("My frame");
        frame.add(new JLabel("Hi Worl."));
        frame.setDefaultCloseOperation(
            WindowConstants.DISPOSE_ON_CLOSE
        );
    }
    frame.setVisible(true);
}
@Override
public void destroy() {
    try {
        java.awt.EventQueue.invokeAndWait(new Runnable() {
            public void run() {
                if (frame != null) {
                    frame.dispose();
                    frame = null;
                }
            }
        });
    } catch (InterruptedException exc) {
        // Ignore.
    } catch (InvocationTargetException exc) {
        throw new RuntimeException(exc);
    }
}

If applets had been introduced in 1.2 or even 1.1, I guess they would have used the EDT to call every method. Slightly obscurely, you should be able to get away with overriding addNotify instead (make sure to call super.addNotify()).


this is class I need to open in a new window from an applet..
http://www.francesdelrio.com/java/IM.java
(also, is window-opening code the same for a JApplet as it is for an applet?)


I would strong suggest not extending JFrame and putting as little as absolutely possible in the JApplet subclass.

Also use anonymous inner classes for listeners rather than attempting to have one class to tries to do everything.

I changed "extends JApplet" to "extends JFrame" in window I need to open, but the file that opens the window can't find this class.. and if I run class from command-line I get this error:
Exception in thread "main" java.lang.NoSuchMethodError: main
(which is why I asked if you have to have a main method if yr swing window is not an applet..)


An application will need a main method. That need have nothing to do with the JFrame class. So:

class MyApp {
    public static void main(String[] args) {
        // We need to be on the EDT.
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                openFrame();
            }
        });
    }

    private static void openFrame() {
        assert java.awt.EventQueue.isDispatchThread();
        JFrame frame = new JFrame("My frame");
        frame.add(new JLabel("Hi Worl."));
        frame.setDefaultCloseOperation(
            WindowConstants.DISPOSE_ON_CLOSE
        );
        frame.setVisible(true);
    }
}

You'll notice that the openFrame methods are very similar, and that we can easily write a program that runs as both an applet and an application easily.

Tom Hawtin

thank you very much ... I cannot believe how complicated it is to open a new window from an applet (not new App, new window..) this is simply for a chat app applet, chat window opens in a new window (new window doesn't mean a separate app.. just means user opens chat app, logs in, chat window opens..) I think I may not have made myself clear..


I already wrote my chatApp interface, now have to change a whole lot to open from applet main window (you know, like a splash window..) :(

inner classes...
EDT..
ok, need to figure all this out... (so what is now in init() method in my chat window interface now goes in an inner class?)


regarding EDT.. from pg previously mentioned..

"Swing components should be created, queried, and manipulated on the event-dispatching thread, but browsers don't invoke applet "milestone" methods from that thread. For this reason, the milestone methods — init, start, stop, and destroy — should use the SwingUtilities method invokeAndWait (or, if appropriate, invokeLater)"

now these invokeAndWait and invokeLater -- are THESE the event-handling threads?
(I was not able to compile code you posted (MyApp.java and frame.java..)


I do understand basic concept of threads (to run several processes at the same time, let's say several connections from a client to a server, or several simultaneous connections to a db...) but I don't understand why you need to do this to display Swing GUI elements..

again, thank you very much for your time..



.



Relevant Pages

  • Re: Force New Window to Open Instead of Taking Over Existing One
    ... > have something open in another window, it always opens in that window ... > litte applet window! ... IE picks the first window open in the task bar to use in both ...
    (microsoft.public.windows.inetexplorer.ie6.browser)
  • Re: Force New Window to Open Instead of Taking Over Existing One
    ... >> have something open in another window, it always opens in that window ... >> litte applet window! ... IE picks the first window open in the task bar to use in both ...
    (microsoft.public.windows.inetexplorer.ie6.browser)
  • Re: Please...Applet frame resize problem
    ... > All I'm trying to do is open a window that displays my applet and lets me ... You say you want to display your applet ... Having something 'pop-up' is also considered ... launch applications* ...
    (comp.lang.java.programmer)
  • Force New Window to Open Instead of Taking Over Existing One
    ... have something open in another window, it always opens in that window ... if you click on a web link somewhere, it opens it in the litte applet ... IE picks the first window open in the task bar to use in both ...
    (microsoft.public.windows.inetexplorer.ie6.browser)
  • Re: opening a window from an applet..
    ... (public class extends JFrame?) ... if it's a JFrame instead of an applet does it still have to have initmethod? ... (can I open a swing window from an applet? ... Which is a frame like any other. ...
    (comp.lang.java.gui)