RFR: 8276056: Control.skin.setSkin(Skin) fails to call dispose() on discarded Skin

Marius Hanl mhanl at openjdk.org
Wed Jun 29 13:40:24 UTC 2022


For some reason the `skinProperty` did not allow to set a new skin which is the same class as the previous one.
This leads to multiple issues:
1. When creating a new skin (same class as previous), the skin will likely install some children and listener but is then rejected when setting it due to the `skinProperty` class constraint
-> Control is in a weird state as the current skin was not disposed since it is still set, although we already and 'set' a new skin
2. A skin of the same class can behave differently, so it is not really valid to reject a skin just because it is the same class as the previous
-> Just imagine we have the following skin class

class MyCustomButtonSkin extends ButtonSkin {
    public MyCustomButtonSkin(Button button, boolean someFlag) { super(button); ... }
}

Now if we would change the skin of the Button two times like this:

button.setSkin(new MyCustomButtonSkin(button, true));
button.setSkin(new MyCustomButtonSkin(button, false));

The second time the skin will be rejected as it is the same class, although I may changed the skin behaviour, in this case demonstrated by a boolean flag for showing purposes.

-------------

Commit messages:
 - 8276056: Allow to set a skin with same class (name) as the previous one

Changes: https://git.openjdk.org/jfx/pull/806/files
 Webrev: https://webrevs.openjdk.org/?repo=jfx&pr=806&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8276056
  Stats: 49 lines in 2 files changed: 34 ins; 13 del; 2 mod
  Patch: https://git.openjdk.org/jfx/pull/806.diff
  Fetch: git fetch https://git.openjdk.org/jfx pull/806/head:pull/806

PR: https://git.openjdk.org/jfx/pull/806


More information about the openjfx-dev mailing list