Scene Builder and<fx:root>
Daniel Fuchs
daniel.fuchs at oracle.com
Fri Jul 13 01:02:47 PDT 2012
On 7/12/12 7:22 PM, openjfx-dev-request at openjdk.java.net wrote:
> Date: Thu, 12 Jul 2012 19:08:37 +0200
> From: Werner Lehmann<lehmann at media-interactive.de>
> Subject: Re: Scene Builder and<fx:root>
> To:openjfx-dev at openjdk.java.net
> Message-ID:<4FFF0495.3010202 at media-interactive.de>
> Content-Type: text/plain; charset="windows-1252"; format=flowed
Hi Werner,
(sorry if this is a duplicate - I replied yesterday but forgot to
fix the subject line - left (Re: openjfx-dev Digest, Vol 8, Issue 25)
so I think my reply was lost)
> Daniel,
>
> On 12.07.2012 18:28, Daniel Fuchs wrote:
>> > As Greg says - you will need to provide a value for the
>> > fx:type attribute in fx:root - and you should be able
>> > to load that in SceneBuilder.
>> >
>> > SceneBuilder does not allow you to set fx:root from within
>> > SceneBuilder itself (I mean, if you create an FXML from
>> > within SceneBuilder it will not have the fx:root element) - but
>> > if you load an FXML whose root element is fx:root then
>> > SceneBuilder should be able to load it, and will preserve it.
> that works indeed. I just had to use "BorderPane" as fx:root type
> attribute value instead of my derived class which SB cannot know about.
>
> What about my other question as to how custom controls can be used in
> Scene Builder? Can I add them to the library, and would it pick up any
> new properties on the right hand side of the SB window? Or, is it
> possible to just manually edit that part of the FXML but still use SB
> for the rest of it?
I see several questions here:
1. No you cannot add your own controls to the Library with
SceneBuilder 1.0.
2. However if your FXML already contains your own controls,
SceneBuilder should be able to load it, unless they require
specific builders/builder factory.
At first load SceneBuilder will recognize that your FXML
contains types that it does not know about - and will pop up
dialog allowing you to enter a classpath.
In some cases, SceneBuilder might be able to load the file even
if you choose to not provide a classpath - but in that case -
the unknown types will not be displayed - neither on the content
view - nor in the hierarchy panel.
Their FXML elements will be preserved however.
If you choose to provide a classpath however, SceneBuilder
should be able to render your custom controls, and you will be
able to manipulate them.
The properties that are specific to your controls will appear in
a 'Miscellaneous' category in the inspector on the right hand
side.
Since SceneBuilder doesn't know about your custom types - it
might not be able to display their subnodes in the Hierarchy
Panel. For instance - if your control extends Pane,
then SceneBuilder will assume that the children are to be found
in the Pane.getChildren() property. However - if it extends
Region directly - then the children will not be displayed in
the hierarchy.
In other words SceneBuilder sees the scenegraph through the
lens of the javafx classes it knows about.
3. If you have provided a classpath - then copy/paste should work
also for your custom types. So if you have an instance of
"FooControl" you should be able to use copy/paste to create
another one.
4. Be also aware that if your custom control behave badly -
then anything could happen - for instance if one of your
custom controls enters in an infinite loop during layout it
can block the UI.
In practice - if you wish to add your own controls and work with
them in SceneBuilder you could:
a. create a skeleton FXML using SceneBuilder
b. at the place where you would like to insert your own control,
insert instead a place holder instance of its closest JavaFX
super class.
c. save and close the file.
d. In NetBeans or Eclipse (or emacs ;-)) change the name of the
place holder element, replace the name of the javafx class with
your own custom class.
Don't forget to add the appropriate <?import ?> clause at
the beginning of the FXML file.
e. From File > Open Recent > - open your file again. You will get
the popup asking for a classpath. Provide the classpath and
you should be able to load the file.
hope this helps,
-- daniel
>
> Werner
More information about the openjfx-dev
mailing list