On Sun, 19 Feb 2023 09:35:53 GMT, SWinxy <d...@openjdk.org> wrote:

>> Many `installDefaults` methods set the font, foreground, and background on 
>> objects but their inverse methods `uninstallDefaults` do not remove them. 
>> I've added an inverse method to remove the colors and font to call for the 
>> `uninstallDefaults` methods that install defaults.
>> 
>> `AquaButtonUI` can call its super since it would otherwise be repeated code. 
>> `BasicComboBoxUI` (weirdly) installs the properties again when it should be 
>> uninstalling them, so I changed.
>> 
>> I noticed that, in a few subclasses, only one of calls to the super of 
>> `installDefaults` and `uninstallDefaults` are made. That is, an overridden 
>> `installDefaults` may call its super while the overridden 
>> `uninstallDefaults` does not call its super (or vise versa). These classes 
>> are: `AquaTabbedPaneUI`, `SynthMenuItemUI`, `SynthSplitPaneUI`, and 
>> `XTextAreaPeer`.
>> 
>> Sorry I couldn't write a test; I wasn't sure how I should have accessed the 
>> protected variable aside from creating extending classes for each class that 
>> changed.
>> 
>> See also #6603, where this issue was discovered.
>
> SWinxy has updated the pull request with a new target base due to a merge or 
> a rebase. The incremental webrev excludes the unrelated changes brought in by 
> the merge/rebase. The pull request contains five additional commits since the 
> last revision:
> 
>  - BasicPanelUI uninstalling font causes cascading problems
>  - Merge branch 'master' into 8278620
>  - Sync with CSR
>    
>    Only difference is that I added an Oxford comma
>  - Accidental imports added
>  - 8278620: properties installed by javax.swing.LookAndFeel installColors and 
> installColorsAndFont are not uninstalled
>    
>    Many installDefaults methods set the font, foreground, and background on 
> objects but their inverse methods uninstallDefaults do not remove them. I've 
> added an inverse method to remove the colors and font to call for the 
> uninstallDefaults methods that install defaults.
>    
>    AquaButtonUI can call its super since it would otherwise be repeated code. 
> BasicComboBoxUI (weirdly) installs the properties again when it should be 
> uninstalling them, so I changed.
>    
>    I noticed that, in a few subclasses, only one of calls to the super of 
> installDefaults and uninstallDefaults are made. That is, an overridden 
> installDefaults may call its super while the overridden uninstallDefaults 
> does not call its super (or vise versa). These classes are: AquaTabbedPaneUI, 
> SynthMenuItemUI, SynthSplitPaneUI, and XTextAreaPeer.

Figured it out. When setting a `Component`'s font to `null`, it inherits the 
font from the component tree. (Some classes omit this fact from their 
respective documentations.) Window peers will check `isFontSet` when they are 
created, and will set it to a `Font` if no font is set. The problem is that 
installing the font checks if the font is critically a `FontUIResource`. This 
means that `setFont(null)` is called on `FontUIResource` fonts, the code goes 
up the hierarchy to non-null fonts, and finds a non-`FontUIResource` font, and 
sets the component to that font, which is originally set by the component peers 
on creation, and then the components can't install a default because it will 
replace a `null` or a `FontUIResource` font. Changing the fallback font type to 
a `FontUIResource` in the peers fixes this. I hope this doesn't break anything 
else lol. (It probably will.)

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

PR: https://git.openjdk.org/jdk/pull/10565

Reply via email to