On Mon, 21 Feb 2022 07:57:32 GMT, Emmanuel Bourg <d...@openjdk.java.net> wrote:

>> When a list of icons is set on a window, the most appropiate icon is 
>> selected depending on the graphics configuration. But if the graphics 
>> configuration changes (because the window is moved to a different screen, or 
>> because the DPI settings of the screen is changed), the frame icon isn't 
>> updated.
>> 
>> Here is an example illustrating the issue:
>> 
>>     public static void main(String[] args) throws Exception {
>>         SwingUtilities.invokeLater(() -> {
>>             JFrame frame = new JFrame("Window Icon Test");
>>             frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
>>             frame.setSize(400, 300);
>>             frame.setVisible(true);
>> 
>>             List<Image> images = new ArrayList<>();
>>             for (int size = 16; size <= 32; size++) {
>>                 // create an image displaying the size used
>>                 BufferedImage image = new BufferedImage(size, size, 
>> BufferedImage.TYPE_INT_ARGB);
>>                 Graphics2D g = image.createGraphics();
>>                 g.setFont(new Font("dialog", Font.BOLD, 12));
>>                 g.setColor(Color.BLACK);
>>                 g.drawString(String.valueOf(size), 0, size - (size - 
>> g.getFont().getSize()) / 2);
>>                 images.add(image);
>>             }
>> 
>>             frame.setIconImages(images);
>>         });
>>     }
>> 
>> On Windows if the screen scaling is set to 100% the 16x16 icon is picked 
>> from the list. If the scaling of the screen is set to 150% while the 
>> application is running, the 16x16 icon is upscaled and looks blurry.
>> 
>> A way to work around this issue is to listen for graphics configuration 
>> changes with:
>> 
>>     frame.addPropertyChangeListener("graphicsConfiguration", event -> 
>> frame.setIconImages(frame.getIconImages()));
>> 
>> 
>> Ideally this should be done automatically by the JDK. Maybe the `WindowPeer` 
>> could call `updateIconImages()` when `updateGraphicsData()` or 
>> `displayChanged()` is invoked?
>
> Emmanuel Bourg has updated the pull request incrementally with five 
> additional commits since the last revision:
> 
>  - Test case for the window icon update on DPI change (other changes)
>  - Test case for the window icon update on DPI change (@compile not needed)
>  - Test case for the window icon update on DPI change (center the frame)
>  - Test case for the window icon update on DPI change (specific message for 
> timeouts)
>  - Test case for the window icon update on DPI change (icon with a white 
> background and centered text)

test/jdk/java/awt/Window/WindowIconUpdateOnDPIChanging/WindowIconUpdateOnDPIChangingTest.java
 line 138:

> 136:         g.setColor(Color.WHITE);
> 137:         g.fillRect(0, 0, size, size);
> 138:         g.setFont(new Font("dialog", Font.BOLD, 12));

Could you please also start the name of the logical font with the capital 
letter?
Suggestion:

        g.setFont(new Font("Dialog", Font.BOLD, 12));

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

PR: https://git.openjdk.java.net/jdk/pull/6180

Reply via email to