<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<p>Hi Andy,<br>
</p>
<p>I'm confused, nowhere do I propose to remove or otherwise make
the CSS reference system implemented by FX unusable.</p>
<p>I'm first trying to ascertain if this would be expected behavior
(it is indeed unspecified, and the default currently seems to have
been chosen for implementation ease, not for user friendliness).</p>
<p>**IF** we're considering this worth changing, the change would
simply be that when you override a variable (like -fx-base) that
this is done WITHOUT elevating all styles that use it to the level
of an AUTHOR stylesheet (ie. they remain at USER_AGENT level as
they're specified by Modena). This is not a bad view, because in
a sense, we're not really specifying a style, we're only
overriding a variable. The actual style is still specified in
Modena, which is a USER_AGENT level stylesheet.</p>
<p>As for the bug fix, please read up a bit more on what was fixed,
and what this is now exposing. The fix is almost completely
unrelated (it fixed accidental changes to unrelated controls at
the same level (ie. siblings) due to cache sharing where one has
had a programmatic change, and the other didn't). This was caused
by a CSS calculation bug (calculation was skipped for all
styleable properties that already had a setter change, if they
were encountered first by the CSS system). Now that this isn't
the case anymore, set values are overwritten with CSS styles more
aggressively. Normally those however are only styles that
originate from an AUTHOR stylesheet, so this can be seen as
expected by the user (after all, they WROTE that stylesheet). But
because all styles that use a variable are being promoted to
AUTHOR level, this also includes all unseen styles in Modena if
you specify the variable in your AUTHOR stylesheet.</p>
<p>> Nowhere did we **actualy** override -fx-text-fill " is not
technically correct since this color depends on -fx-base.</p>
<p>That really depends on your view point. Is overriding a variable
the same as defining all styles (in your AUTHOR stylesheet) that
use that variable? If it was a pre-processor, that created a
fully resolved Modena.css, then this would not be the case. But
it is not implemented as such.</p>
<p>> And I would not want to change how it works currently
because this is the only way (short of overwriting the whole
modena.css styleshseet) for an application to effect a system-wide
change like reacting to changes in the user preferences or the
platform theme.</p>
<p>To be clear, I'm not proposing to change that at all.<br>
</p>
<p>--John<br>
</p>
<div class="moz-cite-prefix">On 09/07/2024 20:00, Andy Goryachev
wrote:<br>
</div>
<blockquote type="cite"
cite="mid:BL3PR10MB618571959FD6D663EDF2B8D2E5DB2@BL3PR10MB6185.namprd10.prod.outlook.com">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="Generator" content="Microsoft Word 15 (filtered
medium)">
<style>@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}@font-face
{font-family:"Yu Gothic";
panose-1:2 11 4 0 0 0 0 0 0 0;}@font-face
{font-family:Aptos;
panose-1:2 11 0 4 2 2 2 2 2 4;}@font-face
{font-family:"Iosevka Fixed SS16";
panose-1:2 0 5 9 3 0 0 0 0 4;}@font-face
{font-family:"Times New Roman \(Body CS\)";
panose-1:2 11 6 4 2 2 2 2 2 4;}@font-face
{font-family:Consolas;
panose-1:2 11 6 9 2 2 4 3 2 4;}@font-face
{font-family:"\@Yu Gothic";
panose-1:2 11 4 0 0 0 0 0 0 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
font-size:10.0pt;
font-family:"Aptos",sans-serif;}a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}span.EmailStyle210
{mso-style-type:personal-reply;
font-family:"Iosevka Fixed SS16";
color:windowtext;}.MsoChpDefault
{mso-style-type:export-only;
font-size:10.0pt;
mso-ligatures:none;}div.WordSection1
{page:WordSection1;}</style>
<div class="WordSection1">
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Iosevka Fixed
SS16"">1) a buggy implementation coupled with lack of
specification creates a certain expectation<o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Iosevka Fixed
SS16"">2) bug gets fixed<o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Iosevka Fixed
SS16"">3) people complain because the feature now works
as it should?<o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Iosevka Fixed
SS16""><o:p> </o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Iosevka Fixed
SS16"">I think (and this is my personal opinion, in the
absence of a formal specification) that this works as
expected now. The statement "</span> Nowhere did we
**actualy** override -fx-text-fill<span
style="font-size:11.0pt;font-family:"Iosevka Fixed
SS16""> " is not technically correct since this color
depends on -fx-base.<o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Iosevka Fixed
SS16""><o:p> </o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Iosevka Fixed
SS16"">And I would not want to change how it works
currently because this is the only way (short of overwriting
the whole modena.css styleshseet) for an application to
effect a system-wide change like reacting to changes in the
user preferences or the platform theme.<o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Iosevka Fixed
SS16""><o:p> </o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Iosevka Fixed
SS16"">-andy<o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Iosevka Fixed
SS16""><o:p> </o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Iosevka Fixed
SS16""><o:p> </o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Iosevka Fixed
SS16""><o:p> </o:p></span></p>
<div id="mail-editor-reference-message-container">
<div>
<div style="border:none;border-top:solid #B5C4DF
1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal" style="margin-bottom:12.0pt"><b><span
style="font-size:12.0pt;color:black">From:
</span></b><span style="font-size:12.0pt;color:black">John
Hendrikx <a class="moz-txt-link-rfc2396E" href="mailto:john.hendrikx@gmail.com"><john.hendrikx@gmail.com></a><br>
<b>Date: </b>Tuesday, July 9, 2024 at 10:45<br>
<b>To: </b>Andy Goryachev
<a class="moz-txt-link-rfc2396E" href="mailto:andy.goryachev@oracle.com"><andy.goryachev@oracle.com></a>, openjfx-dev
<a class="moz-txt-link-rfc2396E" href="mailto:openjfx-dev@openjdk.org"><openjfx-dev@openjdk.org></a><br>
<b>Subject: </b>Re: [External] : Re: CSS Lookups and
their origins (possible regression)<o:p></o:p></span></p>
</div>
<p>Well, it is coming as a surprise to many. With the fix
for the CSS caching bug since JavaFX 21, this "normal"
behavior is becoming much more obvious.<o:p></o:p></p>
<p>Let me repeat one more time:<o:p></o:p></p>
<p>If I have a Label, and I manually set its text fill with
a setter to YELLOW. In JavaFX 17, when I now add a
stylesheet that is empty aside from `-fx-base: WHITE`, the
label's text fill stays YELLOW.
<o:p></o:p></p>
<p>Now do this in JavaFX 21. As soon as you add the
stylesheet with `-fx-base: WHITE` in it, the set value to
YELLOW is overridden, even though technically this value
for -fx-text-fill is defined by Modena (which should not
be overriding set values). Nowhere did we **actualy**
override -fx-text-fill, yet the CSS subsystem now sees
**all** values defined by Modena that are somehow linked
to -fx-base as defined directly by the developer...<o:p></o:p></p>
<p>The reason this didn't happen in JavaFX prior to 21 is
because there was a bug where a CSS value was not fully
calculated if the property it encountered was overridden
via a set value. That was a bug however as cache entries
are shared amongst similar styled nodes, and so not
calculating it fully could have effects on other nodes
that shared that cache entry but did NOT have a property
set directly. Now that this bug is fixed, this problem is
odd behavior is popping up where simply specifying
-fx-base in an empty stylesheet is somehow overriding a
programmatically set text fill. Users are confused by
this, as nowhere in their stylesheet do they themselves
override text fill.<o:p></o:p></p>
<p>This entire mechanism is not specified by CSS, but is
unique to FX. The most similar mechanism in CSS (see
Michael's answer) says the priority of a style should not
be changed when it is using a reference.<o:p></o:p></p>
<p>--John<o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:12.0pt">On
09/07/2024 17:43, Andy Goryachev wrote:<br>
<br>
<o:p></o:p></span></p>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<p class="MsoNormal">> all styles used in Modena that
rely on -fx-base directly or indirectly suddenly have
a higher priority<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">I think it works as designed (and
as expected).<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">-andy<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<div id="mail-editor-reference-message-container">
<div>
<div style="border:none;border-top:solid #B5C4DF
1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal" style="margin-bottom:12.0pt"><b><span
style="font-size:12.0pt;color:black">From:
</span></b><span
style="font-size:12.0pt;color:black">John
Hendrikx <a
href="mailto:john.hendrikx@gmail.com"
moz-do-not-send="true">
<john.hendrikx@gmail.com></a><br>
<b>Date: </b>Tuesday, July 9, 2024 at 08:25<br>
<b>To: </b>Andy Goryachev <a
href="mailto:andy.goryachev@oracle.com"
moz-do-not-send="true"><andy.goryachev@oracle.com></a>,
openjfx-dev
<a href="mailto:openjfx-dev@openjdk.org"
moz-do-not-send="true"><openjfx-dev@openjdk.org></a><br>
<b>Subject: </b>[External] : Re: CSS Lookups
and their origins (possible regression)</span><o:p></o:p></p>
</div>
<p>It's not that you can't use -fx-base, but that as
it is currently that all styles used in Modena
that rely on -fx-base directly or indirectly
suddenly have a higher priority (above setters)
even though you didn't specifically specify them
in your own stylesheet. All such styles are being
elevated from USER_AGENT to AUTHOR level (which is
above USER level which is used for setters).<o:p></o:p></p>
<p>--John<o:p></o:p></p>
<div>
<p class="MsoNormal"><span
style="font-size:12.0pt">On 09/07/2024 17:03,
Andy Goryachev wrote:</span><o:p></o:p></p>
</div>
<blockquote
style="margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<p class="MsoNormal">I've used this feature in
the past to change the colors in all the
controls, so to me this is the expected
behavior.<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">So in your case (if I got
it right), you need to set the direct style on
the label (.setStyle("-fx-text-fill:yellow"))
instead of setting the text fill
programmatically. Right?<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">-andy<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<div
id="mail-editor-reference-message-container">
<div>
<div style="border:none;border-top:solid
#B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"
style="margin-bottom:12.0pt"><b><span
style="font-size:12.0pt;color:black">From:
</span></b><span
style="font-size:12.0pt;color:black">openjfx-dev
<a
href="mailto:openjfx-dev-retn@openjdk.org"
moz-do-not-send="true">
<openjfx-dev-retn@openjdk.org></a>
on behalf of John Hendrikx <a
href="mailto:john.hendrikx@gmail.com"
moz-do-not-send="true">
<john.hendrikx@gmail.com></a><br>
<b>Date: </b>Monday, July 8, 2024 at
17:11<br>
<b>To: </b>openjfx-dev <a
href="mailto:openjfx-dev@openjdk.org"
moz-do-not-send="true"><openjfx-dev@openjdk.org></a><br>
<b>Subject: </b>Re: CSS Lookups and
their origins (possible regression)</span><o:p></o:p></p>
</div>
<p>I realized I worded the TLDR poorly.<o:p></o:p></p>
<p>Let me try again:<o:p></o:p></p>
<p>TLDR; should styles which use references
(like -fx-base used in Modena) become
AUTHOR level styles if -fx-base is
specified in an AUTHOR stylesheet? The
act of simply specifying -fx-base in your
own AUTHOR stylesheet elevates hundreds of
styles from Modena to AUTHOR level, as if
you specified them directly...<o:p></o:p></p>
<p>--John<o:p></o:p></p>
<div>
<p class="MsoNormal"><span
style="font-size:12.0pt">On 09/07/2024
02:07, John Hendrikx wrote:</span><o:p></o:p></p>
</div>
<blockquote
style="margin-top:5.0pt;margin-bottom:5.0pt">
<p>Hi List,<o:p></o:p></p>
<p>TLDR; should a CSS reference like
-fx-base convert all styles that use
this value (or derive from it) become
AUTHOR level styles (higher priority
than setters) ?<o:p></o:p></p>
<p>Long version:<o:p></o:p></p>
<p>In JavaFX 21, I did a fix (see #1072)
to solve a problem where a CSS value
could be reset on an unrelated control.<o:p></o:p></p>
<p>This happened when the CSS engine
encountered a stylable that is
overridden by the user (with a setter),
and decided NOT to proceed with the full
CSS value calculation (as it could not
override the user setting if that CSS
value had lower priority). However, not
proceeding with the calculation meant
that a "SKIP" was stored in a shared
cache which was incorrect. This is
because when this "SKIP" is later
encountered for an unrelated control
(the cache entries are shared for
controls with the same styles at the
same level), they could get their values
reset because they were assumed to be
unstyled.<o:p></o:p></p>
<p>However, this fix has exposed what
seems to be a deeper bug or perhaps an
unfortunate default:<o:p></o:p></p>
<p>JavaFX has a special feature where you
can refer to certain other styles by
using a reference (which is resolved,
recursively, to a final value). This
does not seem to be a CSS standard, but
is a feature only FX has.<o:p></o:p></p>
<p>It works by saying something like:<o:p></o:p></p>
<p> -fx-base: RED;<o:p></o:p></p>
<p>And then using it like this:<o:p></o:p></p>
<p> -fx-text-fill: -fx-base;<o:p></o:p></p>
<p>This feature works accross stylesheets
of different origins, so an AUTHOR
stylesheet can specify -fx-base, and
when a USER_AGENT refers to -fx-base,
the value comes from the AUTHOR
stylesheet.<o:p></o:p></p>
<p>JavaFX then changes the origin of the
style to the highest priority
encountered while resolving the
reference. This means that Modena can
specify "-fx-text-fill: -fx-base", and
when "-fx-base" is then part of the
AUTHOR style sheet, that ALL Modena
styles that use -fx-base will be
considered AUTHOR level styles, as per
this comment:<o:p></o:p></p>
<div>
<div>
<p style="margin:0in;background:white"><span
style="font-size:11.0pt;font-family:Consolas;color:#3F7F5F">// The
origin of this parsed value is the
greatest of</span><o:p></o:p></p>
<p style="margin:0in;background:white"><span
style="font-size:11.0pt;font-family:Consolas;color:#3F7F5F">// any of
the resolved reference. If a
resolved reference</span><o:p></o:p></p>
<p style="margin:0in;background:white"><span
style="font-size:11.0pt;font-family:Consolas;color:#3F7F5F">// comes
from an inline style, for example,
then the value</span><o:p></o:p></p>
<p style="margin:0in;background:white"><span
style="font-size:11.0pt;font-family:Consolas;color:#3F7F5F">//
calculated from the resolved
lookup should have inline</span><o:p></o:p></p>
<p style="margin:0in;background:white"><span
style="font-size:11.0pt;font-family:Consolas;color:#3F7F5F">// as its
origin. Otherwise, an inline style
could be</span><o:p></o:p></p>
<p style="margin:0in;background:white"><span
style="font-size:11.0pt;font-family:Consolas;color:#3F7F5F">// stored in
shared cache.</span><o:p></o:p></p>
</div>
</div>
<p>I feel that this is a really
unfortunate choice. The style after all
was specified by Modena, only its value
came from another (higher priority)
style sheet. I think a more logical
choice would have been to not change the
priority at all, unless a
"-fx-text-fill" is explicitly made part
of the AUTHOR stylesheet.<o:p></o:p></p>
<p>A consequence of this (and which is
much more visible after the fix) is that
creating a Label with a
setTextFill(Color.YELLOW) in its
constructor will only result in a yellow
text fill if the AUTHOR stylesheet did
not override any of the Modena colors
involved in calculating the Modena
-fx-text-fill default. Overriding
-fx-base in any way will result in the
text fill of the label to be overridden
(as the reference came from an AUTHOR
stylesheet, which trumps a setter which
is of a lower style origin).<o:p></o:p></p>
<p>The comment also alludes to a potential
problem. If an inline style would
specify "-fx-base", but would be treated
as if it came from Modena (USER_AGENT
level), then this value could get stored
in the cache as everything except INLINE
styles can be cached. However, I feel
that the changing of style origin level
was then probably done to solve a
CACHING problem, instead of what made
logical sense for users. If we agree
that a resolved reference should not
change the style origin level, then this
would need to be addressed, by perhaps
marking such a calculated value as
uncacheable, instead of overloading the
meaning of style origin.<o:p></o:p></p>
<p>I'd like to hear your thoughts, and
also how to proceed. JavaFX versions
before 21 seemingly allowed overriding
reference without much consequence
because if the user overrode the value
manually, the cache entry would be set
to "SKIP". Now that this is no longer
the case, JavaFX more aggressively
overrides user set values if they happen
to use a referenced value. See code
below.<o:p></o:p></p>
<p>--John<o:p></o:p></p>
<div>
<div>
<p style="margin:0in;background:white"><span
style="font-size:11.0pt;font-family:Consolas;color:black">.root {</span><o:p></o:p></p>
<p style="margin:0in;background:white"><span
style="font-size:11.0pt;font-family:Consolas;color:black">-fx-base:
#ff0000;</span><o:p></o:p></p>
<p style="margin:0in;background:white"><span
style="font-size:11.0pt;font-family:Consolas;color:black">}</span><o:p></o:p></p>
<div>
<div>
<p
style="margin:0in;background:white"><b><span
style="font-size:11.0pt;font-family:Consolas;color:#0000A0">package</span></b><span
style="font-size:11.0pt;font-family:Consolas;color:black"> app;</span><o:p></o:p></p>
<p
style="margin:0in;background:white"><b><span
style="font-size:11.0pt;font-family:Consolas;color:#0000A0">import</span></b><span
style="font-size:11.0pt;font-family:Consolas;color:black">
javafx.application.Application;</span><o:p></o:p></p>
<p
style="margin:0in;background:white"><b><span
style="font-size:11.0pt;font-family:Consolas;color:#0000A0">import</span></b><span
style="font-size:11.0pt;font-family:Consolas;color:black">
javafx.scene.Scene;</span><o:p></o:p></p>
<p
style="margin:0in;background:white"><b><span
style="font-size:11.0pt;font-family:Consolas;color:#0000A0">import</span></b><span
style="font-size:11.0pt;font-family:Consolas;color:black">
javafx.scene.control.Label;</span><o:p></o:p></p>
<p
style="margin:0in;background:white"><b><span
style="font-size:11.0pt;font-family:Consolas;color:#0000A0">import</span></b><span
style="font-size:11.0pt;font-family:Consolas;color:black">
javafx.scene.paint.Color;</span><o:p></o:p></p>
<p
style="margin:0in;background:white"><b><span
style="font-size:11.0pt;font-family:Consolas;color:#0000A0">import</span></b><span
style="font-size:11.0pt;font-family:Consolas;color:black">
javafx.stage.Stage;</span><o:p></o:p></p>
<p
style="margin:0in;background:white"><b><span
style="font-size:11.0pt;font-family:Consolas;color:#0000A0">public</span></b><span
style="font-size:11.0pt;font-family:Consolas;color:black">
</span><b><span
style="font-size:11.0pt;font-family:Consolas;color:#0000A0">class</span></b><span
style="font-size:11.0pt;font-family:Consolas;color:black"> TestApp
</span><b><span
style="font-size:11.0pt;font-family:Consolas;color:#0000A0">extends</span></b><span
style="font-size:11.0pt;font-family:Consolas;color:black"> Application {</span><o:p></o:p></p>
<p
style="margin:0in;background:white"><b><span
style="font-size:11.0pt;font-family:Consolas;color:#0000A0">public</span></b><span
style="font-size:11.0pt;font-family:Consolas;color:black">
</span><b><span
style="font-size:11.0pt;font-family:Consolas;color:#0000A0">static</span></b><span
style="font-size:11.0pt;font-family:Consolas;color:black">
</span><b><span
style="font-size:11.0pt;font-family:Consolas;color:#0000A0">void</span></b><span
style="font-size:11.0pt;font-family:Consolas;color:black"> main(String[]
args) {</span><o:p></o:p></p>
<p
style="margin:0in;background:white"><i><span
style="font-size:11.0pt;font-family:Consolas;color:black">launch</span></i><span
style="font-size:11.0pt;font-family:Consolas;color:black">(args);</span><o:p></o:p></p>
<p
style="margin:0in;background:white"><span
style="font-size:11.0pt;font-family:Consolas;color:black">}</span><o:p></o:p></p>
<p
style="margin:0in;background:white"><span
style="font-size:11.0pt;font-family:Consolas;color:#646464">@Override</span><o:p></o:p></p>
<p
style="margin:0in;background:white"><b><span
style="font-size:11.0pt;font-family:Consolas;color:#0000A0">public</span></b><span
style="font-size:11.0pt;font-family:Consolas;color:black">
</span><b><span
style="font-size:11.0pt;font-family:Consolas;color:#0000A0">void</span></b><span
style="font-size:11.0pt;font-family:Consolas;color:black"> start(Stage
primaryStage) {</span><o:p></o:p></p>
<p
style="margin:0in;background:white"><span
style="font-size:11.0pt;font-family:Consolas;color:black">Scene scene =
</span><b><span
style="font-size:11.0pt;font-family:Consolas;color:#0000A0">new</span></b><span
style="font-size:11.0pt;font-family:Consolas;color:black"> Scene(</span><b><span
style="font-size:11.0pt;font-family:Consolas;color:#0000A0">new</span></b><span
style="font-size:11.0pt;font-family:Consolas;color:black"> MyLabel());</span><o:p></o:p></p>
<p
style="margin:0in;background:white"><span
style="font-size:11.0pt;font-family:Consolas;color:#3F7F5F">// See the
difference with/without
-fx-base in the
<u>stylesheet</u></span><o:p></o:p></p>
<p
style="margin:0in;background:white"><span
style="font-size:11.0pt;font-family:Consolas;color:black">scene.getStylesheets().add(TestApp.</span><b><span
style="font-size:11.0pt;font-family:Consolas;color:#0000A0">class</span></b><span
style="font-size:11.0pt;font-family:Consolas;color:black">.getResource(</span><span
style="font-size:11.0pt;font-family:Consolas;color:#2A00FF">"/style.css"</span><span
style="font-size:11.0pt;font-family:Consolas;color:black">).toExternalForm());</span><o:p></o:p></p>
<p
style="margin:0in;background:white"><span
style="font-size:11.0pt;font-family:Consolas;color:black">primaryStage.setScene(scene);</span><o:p></o:p></p>
<p
style="margin:0in;background:white"><span
style="font-size:11.0pt;font-family:Consolas;color:black">primaryStage.show();</span><o:p></o:p></p>
<p
style="margin:0in;background:white"><span
style="font-size:11.0pt;font-family:Consolas;color:black">}</span><o:p></o:p></p>
<p
style="margin:0in;background:white"><span
style="font-size:11.0pt;font-family:Consolas;color:black">}</span><o:p></o:p></p>
<p
style="margin:0in;background:white"><b><span
style="font-size:11.0pt;font-family:Consolas;color:#0000A0">class</span></b><span
style="font-size:11.0pt;font-family:Consolas;color:black"> MyLabel
</span><b><span
style="font-size:11.0pt;font-family:Consolas;color:#0000A0">extends</span></b><span
style="font-size:11.0pt;font-family:Consolas;color:black"> Label {</span><o:p></o:p></p>
<p
style="margin:0in;background:white"><b><span
style="font-size:11.0pt;font-family:Consolas;color:#0000A0">public</span></b><span
style="font-size:11.0pt;font-family:Consolas;color:black"> MyLabel() {</span><o:p></o:p></p>
<p
style="margin:0in;background:white"><span
style="font-size:11.0pt;font-family:Consolas;color:black">setTextFill(Color.</span><span
style="font-size:11.0pt;font-family:Consolas;color:#0000C0">YELLOW</span><span
style="font-size:11.0pt;font-family:Consolas;color:black">);</span><o:p></o:p></p>
<p
style="margin:0in;background:white"><span
style="font-size:11.0pt;font-family:Consolas;color:black">setText(</span><span
style="font-size:11.0pt;font-family:Consolas;color:#2A00FF">"Hello
world"</span><span
style="font-size:11.0pt;font-family:Consolas;color:black">);</span><o:p></o:p></p>
<p
style="margin:0in;background:white"><span
style="font-size:11.0pt;font-family:Consolas;color:black">}</span><o:p></o:p></p>
<p
style="margin:0in;background:white"><span
style="font-size:11.0pt;font-family:Consolas;color:black">}</span><o:p></o:p></p>
</div>
</div>
</div>
</div>
<p> <o:p></o:p></p>
</blockquote>
</div>
</div>
</div>
</blockquote>
</div>
</div>
</div>
</blockquote>
</div>
</div>
</div>
</blockquote>
</body>
</html>