[API Review] RT-27887: introduce a node to embed Swing into JavaFX

Richard Bair richard.bair at oracle.com
Thu Jan 24 11:16:15 PST 2013


I guess there should also be a contentProperty() method?

On Jan 24, 2013, at 10:49 AM, Anton V. Tarasov <anton.tarasov at oracle.com> wrote:

> Hi All,
> 
> Please, review a request to add a new SwingNode class:
> 
> http://javafx-jira.kenai.com/browse/RT-27887
> 
> /**
> * This class is used to embed a Swing content into a JavaFX application.
> * The content to be displayed is specified with the {@link #setContent} method
> * that accepts an instance of Swing {@code JComponent}. The hierarchy of components
> * contained in the {@code JComponent} instance should not contain any heavyweight
> * components, otherwise {@code SwingNode} may fail to paint it. The content gets
> * repainted automatically. All the input and focus events are forwarded to the
> * {@code JComponent} instance transparently to the developer.
> * <p>
> * Here is a typical pattern which demonstrates how {@code SwingNode} can be used:
> * <pre>
> *     public class SwingFx extends Application {
> *
> *         private SwingNode swingNode;
> *
> * &#064;Override
> *         public void start(Stage stage) {
> *             swingNode = new SwingNode();
> *
> *             createAndSetSwingContent();
> *
> *             StackPane pane = new StackPane();
> *             pane.getChildren().add(swingNode);
> *
> *             stage.setScene(new Scene(pane, 100, 50));
> *             stage.show();
> *         }
> *
> *         private void createAndSetSwingContent() {
> *             SwingUtilities.invokeLater(new Runnable() {
> * &#064;Override
> *                 public void run() {
> *                     swingNode.setContent(new JButton("Click me!"));
> *                 }
> *             });
> *         }
> *     }
> * </pre>
> */
> public class SwingNode extends Node {
>   /**
>     * Constructs a new instance of {@code SwingNode}.
>     */
>    public SwingNode();
> 
>    /**
>     * Attaches a {@code JComponent} instance to display in this {@code SwingNode}.
>     * The method can be called either on the event dispatch thread or the JavaFX
>     * application thread.
>     *
>     * @param content a component to display in this {@code SwingNode}
>     *
>     * @see java.awt.EventQueue#isDispatchThread()
>     * @see javafx.application.Platform#isFxApplicationThread()
>     */
>    public void setContent(final JComponent content);
> 
>    /**
>     * Returns the {@code JComponent} instance attached to this {@code SwingNode}.
>     *
>     * @return the {@code JComponent} instance attached to this {@code SwingNode}
>     */
>    public JComponent getContent();
> }
> 
> Additional question is about disposing. When SwingNode is removed from a Scene its underlying
> resources (on the AWT toolkit side) should be released. An option is to add a "dispose" method to
> the node and leave it to a user's discretion when to call it. However, having this managed
> automatically would be preferable. For that, a node should be able to be notified when it is no
> longer a part of a rendering process. This is an issue and it is tracked separately as RT-129.
> 
> Thanks,
> Anton.
> 
> 



More information about the openjfx-dev mailing list