[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Newsgroup Home]
[news.eclipse.platform.rcp] Re: Problem using Swing from org.eclipse.core.runtime.applications extension

Cool, thanks for posting the code.

Rafael

Harold Mills wrote:

> Thank you for this information: as you pointed out the problem was that I
> misunderstood how the setVisible method works. It blocks for a modal
> JDialog but not for a JFrame. The following IPlatformRunnable does the
> right thing:

> package clo.brp.test.eclipse.rcp.test1;

> import java.awt.event.WindowAdapter;
> import java.awt.event.WindowEvent;

> import javax.swing.JFrame;
> import javax.swing.WindowConstants;

> import org.eclipse.core.runtime.IPlatformRunnable;

> public class Application implements IPlatformRunnable {

>     public Object run(Object args) {

>         MainFrame frame = new MainFrame();
>         frame.setVisible(true);
>         frame.waitForClosure();

>         System.out.println("frame closed");

>         return IPlatformRunnable.EXIT_OK;

>     }

>     private class MainFrame extends JFrame {

>         private Object mSyncObject = new Object();

>         public MainFrame() {

>             setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

>             addWindowListener(new WindowAdapter() {
>                 public void windowClosed(WindowEvent inEvent) {
>                     synchronized (mSyncObject) {
>                         mSyncObject.notifyAll();
>                     }
>                 }
>             });

>         }

>         public void waitForClosure() {
>             synchronized (mSyncObject) {
>                 try {
>                     mSyncObject.wait();
>                 } catch (InterruptedException e) { }
>             }
>         }

>     }

> }

> Rafael Chaves wrote:

> > What happens in a regular Java application is that Swing will create an
> > additional thread. The call to setVisible(true) causes the thread to be
> > created, but never blocks. The VM stays running the Swing thread, while
> > the main thread runs the main method to completion and ends.

> > The difference is that in Eclipse, when the application finishes running,
> > Eclipse will start the shutdown sequence. And the last step in the
> > shutdown sequence is to call System.exit(), what will exit the VM no
> > matter how many threads are currently running.

> > Your application should block waiting (using a monitor, for instance)
> > until you believe it is time to exit (the windowClosing event, for
> > instance). In the callback for that event, you could notify the monitor so
> > the main thread would complete running, and Eclipse's shutdown sequence
> > could start.

> > Rafael

> > Harold Mills wrote:

> > > I have an existing Swing application to which I would like to add plug-in
> > > support. I hope to use the Eclipse plug-in facility for this purpose. To
> > > convince myself that this can work, I'm trying to write a small Eclipse
> > > plug-in containing an org.eclipse.core.runtime.applications extension as
> > > follows:

> > > package clo.brp.rcp;

> > > import javax.swing.JFrame;

> > > import org.eclipse.core.runtime.IPlatformRunnable;

> > > public class RcpApplication implements IPlatformRunnable {

> > >     public Object run(Object args) {

> > >     	JFrame frame = new JFrame("RcpApplication");
> > >     	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
> > >     	frame.setVisible(true);

> > >     	System.out.println("back from setVisible");

> > >     	return IPlatformRunnable.EXIT_OK;

> > >     }

> > > }

> > > This almost works, except that the call to frame.setVisible returns
> > > immediately instead of blocking until the user dismisses the JFrame, the
> > > normal behavior for a Swing application. So the JFrame appears only
> > > briefly and then the program exits. Does anybody know how I can fix this?