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

Anton V. Tarasov anton.tarasov at oracle.com
Thu Jan 24 12:26:56 PST 2013


On 1/24/13 7:36 PM, Tom Schindl wrote:
> Am 24.01.13 19:49, schrieb Anton V. Tarasov:
>> 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.
>>
> Is this really true? What if you only temporarily detach it from the
> Scene-Graph, you most likely don't want it to get cleaned!
Hi Tom,

Sure, one should be able to re-add the node to the scene. So, in 
auto-dispose
scenario we rather don't want to "kill" the node completely, but just 
free the underlying
resources in such a way that we be able to re-create them, transparently 
to the user,
when he/she is adding the node back. So, in this aspect public "dispose" 
method
would differ, because usually a "dispose" method doesn't assume recreation.
(I should have mention this above)

Thanks,
Anton.
>



More information about the openjfx-dev mailing list