On 18/06/2020 02:30, Sergey Bylokhov wrote:
On 6/17/20 5:50 pm, Sergey Bylokhov wrote:

I guess it is too early to compare behavior before and after the fix since the fix has a few bugs.   - It does not fetch several sizes, as it was expected from the code, but load only one native size
and map it to the different resolutions.

Yes, I re-read your message and found this mistake.
I fixed it locally.

Then I noticed JFileChooser does not really use the new method which returns MRI, so this explains why JFileChooser never adjusts the icons according the screen DPI.

I modified Win32ShellFolder2.getIcon(boolean) to use getIcon(size) instead of getIcon(getAbsolutePath(), getLargeIcon), and now the file icons are updated when JFileChooser window is moved from standard DPI monitor to a High DPI one (150%) and back. I noticed one artefact though: the customised icons from disk drives disappeared, some file icons look clipped, on either monitor.

  - It reverts part of the JDK-8151385, and as far as I understand the bug described in
    8151385 starts to reproduce.

I couldn't reproduce it. The icon seems to be wrapped into MultiResolutionIconImage.


BTW I think the best possible fix is to load all actually existed icons into the MRI:   - The user will be able to use any of these icons via MRI.getResolutionVariants()
  - And it solves all problems related to HiDPI.

Wouldn't it be a waste of memory?
If the app or JFileChooser shows only 16×16 icon, especially in the environment with only one monitor and standard DPI, loading the entire set will take some memory. It could also reduce the speed of showing the JFileChooser interface.

But the open question is it possible to "load all actually existed icons" or not.

I believe it's possible. But we'll have to use different API.


And if that's not possible then we need to investigate different possible approaches.
 - Returning exact icon as the user requested

This was the initial approach.

 - Returning some predefined array of icons
 - Returning some predefined MRI.

This is how it's implemented in webrev.01 by Alexander.

 - Load all the icons at once
 - Load icons on the fly when the rendering are occurring
etc.


Loading icons on the fly seems the most memory-effective way.

In general, I like Alexander's current approach.


Regards,
Alexey

Reply via email to