<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <p>The mechanism does seem like it is a bit poorly designed, as it
      is easy to create inconsistencies.</p>
    <p>Luckily it seems that you can't remove a graphic yourself from a
      Control (getChildren is protected).</p>
    <p>I don't think there is an easy solution though...<br>
    </p>
    <p>I think that once you set a graphic on a Labeled, you need to
      somehow mark it as "in use".  Normally you could just check parent
      != null for this, but it is trickier than that.  The Skin
      ultimately determines if it adds the graphic as child, which may
      be delayed or may even be disabled (content display property is
      set to showing TEXT only).</p>
    <p>Perhaps Skins should always add the graphic and just hide it
      (visible false, managed false), but that's going to be hard to
      enforce.</p>
    <p>Marking the graphic as "in use" could be done with:</p>
    <p>- a property in `getProperties`<br>
      - a new "owner" or "ownedBy" property<br>
      - allowing "parent" to be set without adding it to children
      (probably going to mess up stuff)</p>
    <p>--John<br>
    </p>
    <div class="moz-cite-prefix">On 01/12/2022 15:21, Nir Lisker wrote:<br>
    </div>
    <blockquote type="cite"
cite="mid:CA+0ynh9ujsE8KNSy7HhszZ2+j3ROZv-Ms_Q=XgyuXPehJrEBiQ@mail.gmail.com">
      <meta http-equiv="content-type" content="text/html; charset=UTF-8">
      <div dir="ltr">Technically it doesn't appear elsewhere in the
        scenegraph, it is the child of only one label. It's set as the
        graphics property of 2 labels though. The mismatch is that being
        set as a graphics property isn't a 1-to-1 relationship with
        being a child of the label.
        <div><br>
        </div>
        <div>Something has to be fixed along this chain of
          inconsistency, I just wasn't sure where. It seems like the IAE
          that you mentioned should be thrown, but isn't. I can write a
          PR for that. One thing I'm not sure about is: in a situation
          where the graphic belongs to a label that is detached from a
          scene, and that graphic is set to a label that *is* part of a
          scene, should an IAE be thrown as well.</div>
      </div>
    </blockquote>
    Even if the Labeled is part of the Scene, the graphic may not be
    (depending on Skin used and on Content Display property for the
    default skin).<br>
    <blockquote type="cite"
cite="mid:CA+0ynh9ujsE8KNSy7HhszZ2+j3ROZv-Ms_Q=XgyuXPehJrEBiQ@mail.gmail.com">
      <div dir="ltr">
        <div><br>
        </div>
        <div>By the way, changing to throwing an IAE is going to cause
          some new exceptions. There is a possibility that some
          VirtualFlow things will break because that mechanism recycles
          nodes and re-attaches their properties. Then again, it might
          just mean that it was done wrong.</div>
      </div>
      <br>
      <div class="gmail_quote">
        <div dir="ltr" class="gmail_attr">On Thu, Dec 1, 2022 at 3:49 PM
          John Hendrikx <<a href="mailto:john.hendrikx@gmail.com"
            target="_blank" moz-do-not-send="true"
            class="moz-txt-link-freetext">john.hendrikx@gmail.com</a>>
          wrote:<br>
        </div>
        <blockquote class="gmail_quote" style="margin:0px 0px 0px
          0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
          <div>
            <p>Sorry, I meant on the first click already.<br>
            </p>
            <p>--John<br>
            </p>
            <div>On 01/12/2022 14:46, John Hendrikx wrote:<br>
            </div>
            <blockquote type="cite">
              <p>Setting the same Node for multiple graphics is not
                allowed.  Your program should IMHO throw
                "IllegalArgumentException" on the 2nd click.<br>
              </p>
              <p>     * An optional icon for the Labeled. This can be
                positioned relative to the<br>
                     * text by using {@link #setContentDisplay}.  The
                node specified for this<br>
                     * variable cannot appear elsewhere in the scene
                graph, otherwise<br>
                     * the {@code IllegalArgumentException} is thrown. 
                See the class<br>
                     * description of {@link Node} for more detail.</p>
              <p>--John<br>
              </p>
              <div>On 01/12/2022 13:38, Nir Lisker wrote:<br>
              </div>
              <blockquote type="cite">
                <div dir="ltr">That's my point. Currently, a node can
                  serve as the graphics property for multiple Labels,
                  but will appear only in 1 because it can only have a
                  single parent in the scenegraph. While this is
                  technically fine, it causes issues like the one I
                  showed above. I'm not sure if a node is supposed to be
                  able to serve as multiple graphics (and displayed only
                  in the last Label it was set to?), or removed from
                  other Labels' graphic properties just like is done for
                  children in the scenegraph. Personally, I find it
                  confusing that label.getGraphics() will return a node
                  that isn't shown in that label.</div>
                <br>
                <div class="gmail_quote">
                  <div dir="ltr" class="gmail_attr">On Thu, Dec 1, 2022
                    at 2:21 PM John Hendrikx <<a
                      href="mailto:john.hendrikx@gmail.com"
                      target="_blank" moz-do-not-send="true"
                      class="moz-txt-link-freetext">john.hendrikx@gmail.com</a>>
                    wrote:<br>
                  </div>
                  <blockquote class="gmail_quote" style="margin:0px 0px
                    0px 0.8ex;border-left:1px solid
                    rgb(204,204,204);padding-left:1ex">Internally the
                    graphics is just a child node, and nodes can't be
                    part of <br>
                    the scene graph twice (this is done in
                    LabeledSkinBase).<br>
                    <br>
                    It showing up only once is probably because it is
                    getting removed from <br>
                    the other labels.<br>
                    <br>
                    I think things are probably getting out of sync,
                    where the graphics <br>
                    property may think it still has a certain node as
                    its graphics, but it <br>
                    is no longer a child of the label.<br>
                    <br>
                    --John<br>
                    <br>
                    On 01/12/2022 11:23, Nir Lisker wrote:<br>
                    > Hi,<br>
                    ><br>
                    > Given the following code<br>
                    ><br>
                    >         var cb1 = new Label("1");<br>
                    >         var cb2 = new Label  ("2");<br>
                    >         var b1 = new Button("A");<br>
                    >         cb1.setGraphic(b1);<br>
                    >         b1.setOnAction(e -> {<br>
                    >             if (b1.getParent() == cb1) {<br>
                    >                 // cb1.setGraphic(null);<br>
                    >                 cb2.setGraphic(b1);<br>
                    >             } else {<br>
                    >                 // cb2.setGraphic(null);<br>
                    >                 cb1.setGraphic(b1);<br>
                    >             }<br>
                    >         });<br>
                    ><br>
                    > Pressing the first button will move it (the
                    graphic) to the second <br>
                    > label, however, pressing it again will not move
                    it back to the first <br>
                    > label. It's required to set the graphics to
                    null prior to moving them <br>
                    > as in the commented lines. This looks like a
                    bug to me. I would think <br>
                    > that when a graphic is moved, it will appear in
                    its new label <br>
                    > immediately, like moving a child. Apparently a
                    single node can be the <br>
                    > graphics for multiple Labeled nodes, but it
                    will appear only in 1. Is <br>
                    > this intentional?<br>
                    ><br>
                    > - Nir<br>
                  </blockquote>
                </div>
              </blockquote>
            </blockquote>
          </div>
        </blockquote>
      </div>
    </blockquote>
  </body>
</html>