<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1252">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Verdana;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@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;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        font-size:10.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0in;
        margin-right:0in;
        margin-bottom:0in;
        margin-left:.5in;
        font-size:10.0pt;
        font-family:"Calibri",sans-serif;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;
        mso-ligatures:none;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:461116425;
        mso-list-type:hybrid;
        mso-list-template-ids:1569478058 54670716 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;}
@list l0:level1
        {mso-level-start-at:0;
        mso-level-number-format:bullet;
        mso-level-text:\F0D8 ;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;
        mso-fareast-font-family:"Times New Roman";
        mso-bidi-font-family:"Times New Roman \(Body CS\)";}
@list l0:level2
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:"Courier New";}
@list l0:level3
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7 ;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;}
@list l0:level4
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7 ;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Symbol;}
@list l0:level5
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:"Courier New";}
@list l0:level6
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7 ;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;}
@list l0:level7
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7 ;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Symbol;}
@list l0:level8
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:"Courier New";}
@list l0:level9
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7 ;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        font-family:Wingdings;}
ol
        {margin-bottom:0in;}
ul
        {margin-bottom:0in;}
--></style>
</head>
<body lang="EN-US" link="blue" vlink="purple" style="word-wrap:break-word">
<div class="WordSection1">
<ul style="margin-top:0in" type="disc">
<li class="MsoListParagraph" style="margin-left:0in;mso-list:l0 level1 lfo1"><span style="font-size:9.0pt;font-family:"Verdana",sans-serif">Offtopic: Maybe we should collect the things which should be public in our opinion at one point to (better) get this
 started as well?<o:p></o:p></span></li></ul>
<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"">My sentiment exactly!  Marius, would you like to create a new thread?<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"">Thanks!<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>
<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;font-family:"Aptos",sans-serif;color:black">From:
</span></b><span style="font-size:12.0pt;font-family:"Aptos",sans-serif;color:black">openjfx-dev <openjfx-dev-retn@openjdk.org> on behalf of Marius Hanl <mariushanl@web.de><br>
<b>Date: </b>Thursday, March 7, 2024 at 15:40<br>
<b>To: </b>Robert Lichtenberger <r.lichtenberger@gmail.com><br>
<b>Cc: </b>openjfx-dev@openjdk.org <openjfx-dev@openjdk.org><br>
<b>Subject: </b>Aw: Re: Validation Support<o:p></o:p></span></p>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Verdana",sans-serif">One note here regarding that a lot of things are final in JavaFX:<o:p></o:p></span></p>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Verdana",sans-serif"> <o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Verdana",sans-serif">The problem is not that everything is final - this is intended and makes sense, since we speak mostly of properties here. Overriding those will not give you any benefit.<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Verdana",sans-serif">You mostly want to override e.g. Controls if you add something new to it (a new property) or may just want to set another default skin.<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Verdana",sans-serif">This design is mostly superior than e.g. Swing, where you can override things and easily break something if not too careful.<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Verdana",sans-serif">Pretty sure that this were some lessons learned from the development of Swing.<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Verdana",sans-serif"> <o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Verdana",sans-serif">The biggest problem is rather that a lot of methods are package private or 'Accessors' are used to call specific methods, which is not just a questionable design but also restrict
 the usage.<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Verdana",sans-serif"> <o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Verdana",sans-serif">It is often not possible to override even a minor feature inside the skin.<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Verdana",sans-serif">So you may rather want to recreate the skin then, and copy the existing skin and just change some stuff. But this will mostly not work either, as there is a lot of internal
 API usage, e.g. Accessors or some com.sun.javafx.scene.control.skin.Utils usage.<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Verdana",sans-serif"> <o:p></o:p></span></p>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Verdana",sans-serif">Want to set the width of a TableColumn? Well, the internal com.sun.javafx.scene.control.TableColumnBaseHelper.TableColumnBaseAccessor can do that, you can not.<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Verdana",sans-serif">Get the width of a text String? Well, you can use com.sun.javafx.scene.control.skin.Utils.computeTextWidth...<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Verdana",sans-serif"> <o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Verdana",sans-serif">Offtopic: Maybe we should collect the things which should be public in our opinion at one point to (better) get this started as well?<o:p></o:p></span></p>
</div>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Verdana",sans-serif"> <o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="DE" style="font-size:9.0pt;font-family:"Verdana",sans-serif">-- Marius<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="DE" style="font-size:9.0pt;font-family:"Verdana",sans-serif"> 
<o:p></o:p></span></p>
<div style="border:none;border-left:solid #C3D9E5 1.5pt;padding:0in 0in 0in 8.0pt;margin-left:7.5pt;margin-top:7.5pt;margin-right:3.75pt;margin-bottom:3.75pt" name="quote">
<div style="margin-bottom:7.5pt">
<p class="MsoNormal"><b><span lang="DE" style="font-size:9.0pt;font-family:"Verdana",sans-serif">Gesendet:</span></b><span lang="DE" style="font-size:9.0pt;font-family:"Verdana",sans-serif"> Montag, 04. März 2024 um 08:13 Uhr<br>
<b>Von:</b> "Robert Lichtenberger" <r.lichtenberger@gmail.com><br>
<b>An:</b> openjfx-dev@openjdk.org<br>
<b>Betreff:</b> Re: Validation Support<o:p></o:p></span></p>
</div>
<div name="quoted-content">
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Verdana",sans-serif">First off, as the original author of ValidatorFX I feel flattered by the<br>
suggestion of including it into the JavaFX core :-).<br>
<br>
Some thoughts / insights I gained from developing ValidatorFX:<br>
<br>
* ValidatorFX is (with the possible exception of GraphicDecoration.java)<br>
rather trivial code and also very small (< 1k lines of library code).<br>
But it seems to have filled a market gap according (a few thousand<br>
unique ip downloads every month, issues from ca. a dozen people so far,<br>
even a few PRs). These "market gaps" get filled rarely because they are<br>
not a commercially attractive opportunity. On the other hand if you<br>
decide (like I did with ValidatorFX) to take your closed source solution<br>
and make it open source, you are "rewarded" by increased overhead at<br>
first. But the market gaps exist and hinder broader JavaFX adoption.<br>
<br>
* ValidatorFX is probably only one part needed for application<br>
developers. The other part is a form library that allows to layout<br>
fields, have buttons (that are connected to field validation, etc.). It<br>
looks like this is written again and again by every application developer.<br>
<br>
* To answer John's question if JavaFX could do more to help make tools<br>
like ValidatorFX easy to build:<br>
<br>
** There's the TooltipWrapper class in ValidatorFX which works around<br>
JDK-8090379. Not a big deal but something many application developers<br>
will probably be annoyed by.<br>
<br>
** On a more general note, if I were the king of the JavaFX universe for<br>
one day, I would forbid anyone to make classes or methods final. As an<br>
application developer I prefer to be able to tweak things easily, even<br>
if they may break in the future (which they will anyway ...). Don't take<br>
that decision away from me, it's patronizing. But I guess this is one of<br>
those things that depend very much on which side of the equation you<br>
are, so don't take my troll bait :-).<br>
<br>
<br>
--Robert<br>
<br>
<br>
Am 03.03.24 um 02:10 schrieb John Hendrikx:<br>
> Hi Dirk,<br>
><br>
> That is a very nice framework, and although I wouldn't be against its<br>
> inclusion in FX, I'm more wondering if JavaFX could do more to help<br>
> make tools like ValidatorFX easy to build.<br>
><br>
> I'm not quite sure how one can use not having validation as an<br>
> argument against using FX, when there clearly are free alternatives<br>
> available.  Surely not everything can or should be part of the base<br>
> framework?  A line must be drawn somewhere, especially when there are<br>
> very few core FX developers.<br>
><br>
> I'd much rather see work being done on things that can't be provided<br>
> by 3rd parties, preferably by opening up more parts of FX with well<br>
> specified API's.<br>
><br>
> --John<br>
><br>
> On 01/03/2024 11:59, Dirk Lemmermann wrote:<br>
>> Hi everyone,<br>
>><br>
>> I updated the validation framework ValidatorFX today in our project<br>
>> to the latest release and I really like it a lot. It is a small<br>
>> compact API and works with any observable as opposed to the<br>
>> validation support provided by ControlsFX.<br>
>><br>
>> Using it made me wonder whether it would make sense to bundle it or<br>
>> something like it directly with JavaFX. Developers often mention<br>
>> missing validation support as a drawback of using JavaFX. Adding this<br>
>> would take one item off from the list of arguments against using JavaFX.<br>
>><br>
>> Many UI frameworks do have built-in validation support, e.g. Vaadin<br>
>> [0], Angular, [1], or QT [2]<br>
>><br>
>> What do you think?<br>
</span><span lang="DE" style="font-size:9.0pt;font-family:"Verdana",sans-serif">>><br>
>> —Dirk<br>
>><br>
>> [0]<br>
>> </span><a href="https://vaadin.com/docs/latest/binding-data/components-binder-validation" target="_blank"><span lang="DE" style="font-size:9.0pt;font-family:"Verdana",sans-serif">https://vaadin.com/docs/latest/binding-data/components-binder-validation</span></a><span lang="DE" style="font-size:9.0pt;font-family:"Verdana",sans-serif"><br>
>> [1] </span><a href="https://angular.io/guide/form-validation" target="_blank"><span lang="DE" style="font-size:9.0pt;font-family:"Verdana",sans-serif">https://angular.io/guide/form-validation</span></a><span lang="DE" style="font-size:9.0pt;font-family:"Verdana",sans-serif"><br>
>> [2] </span><a href="https://doc.qt.io/qt-6/qtquick-input-textinput.html" target="_blank"><span lang="DE" style="font-size:9.0pt;font-family:"Verdana",sans-serif">https://doc.qt.io/qt-6/qtquick-input-textinput.html</span></a><span lang="DE" style="font-size:9.0pt;font-family:"Verdana",sans-serif"><br>
>><o:p></o:p></span></p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>