RFR: 8348760: RadioButton is not shown if JRadioButtonMenuItem is rendered with ImageIcon in WindowsLookAndFeel [v4]

Alexey Ivanov aivanov at openjdk.org
Thu Jan 30 11:50:48 UTC 2025


On Thu, 30 Jan 2025 09:59:33 GMT, Prasanta Sadhukhan <psadhukhan at openjdk.org> wrote:

>> When JRadioButtonMenuItem is called with imageIcon, then only imageIcon is shown without radiobutton in WIndowsLookAndFeel as there was no provision of drawing the radiobutton alongside icon.
>> If icon is not there, the radiobutton is drawn. Added provision of drawing the radiobutton windows Skin even when imageIcon is present.
>
> Prasanta Sadhukhan has updated the pull request incrementally with one additional commit since the last revision:
> 
>   optimise

I am also for generating an `ImageIcon` on the fly _to avoid adding a binary file_.

src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsIconFactory.java line 887:

> 885:                 }
> 886:                 if (icon != null) {
> 887:                     if (!((AbstractButton) c).isSelected()) {

This new block of code 887–918 copies that from above 855–884.

You should create a helper method instead copying the same code in the two branches of code, or the code should be re-arranged somehow.

src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsIconFactory.java line 891:

> 889:                         Part part;
> 890:                         if (type == JRadioButtonMenuItem.class) {
> 891:                             part = Part.BP_RADIOBUTTON;

The part  `Part.BP_RADIOBUTTON` doesn't look right to me.

The selected case above always uses the part `Part.MP_POPUPCHECK` — and it looks correct because this code paints a menu item (and radio or check menu items are usually in popup menus rather than on the menu bar).

src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsIconFactory.java line 894:

> 892:                         } else {
> 893:                             part = Part.MP_POPUPCHECK;
> 894:                         }

Suggestion:

                        Part part = (type == JRadioButtonMenuItem.class)
                                    ? Part.BP_RADIOBUTTON
                                    : Part.MP_POPUPCHECK;

Moreover, you use this syntax below.

src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsIconFactory.java line 907:

> 905:                                     (type == JRadioButtonMenuItem.class)
> 906:                                             ? State.BULLETDISABLED
> 907:                                             : State.CHECKMARKDISABLED;

Suggestion:

                            state = (type == JRadioButtonMenuItem.class)
                                    ? State.BULLETDISABLED
                                    : State.CHECKMARKDISABLED;

For consistency with the code in the block above `else`.

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

Changes requested by aivanov (Reviewer).

PR Review: https://git.openjdk.org/jdk/pull/23324#pullrequestreview-2583633590
PR Review Comment: https://git.openjdk.org/jdk/pull/23324#discussion_r1935463611
PR Review Comment: https://git.openjdk.org/jdk/pull/23324#discussion_r1935467489
PR Review Comment: https://git.openjdk.org/jdk/pull/23324#discussion_r1935452320
PR Review Comment: https://git.openjdk.org/jdk/pull/23324#discussion_r1935454098


More information about the client-libs-dev mailing list