[API Review] RT-27887: introduce a node to embed Swing into JavaFX
Anton V. Tarasov
anton.tarasov at oracle.com
Sun Jan 27 23:44:33 PST 2013
Richard,
Please, share your thoughts on this. It directly relates to the API.
Thanks,
Anton.
On 25.01.2013 16:06, Anton V. Tarasov wrote:
> Hi Richard,
>
> On 24.01.2013 23:16, Richard Bair wrote:
>> I guess there should also be a contentProperty() method?
>
> Seems like it should be. But... what about threading? It looks like there are no technical
> barriers to implement synchronized get/set for a Property.
> If that is the case, would it be Ok to have such a property (which we will specify as kind of
> thread-safe) in FX API?
>
> Thanks,
> Anton.
>
>>
>> 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;
>>> *
>>> *@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() {
>>> *@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