RFR: 8288882: JFileChooser - empty (0 bytes) file is displayed as 1 KB [v28]

Abhishek Kumar duke at openjdk.org
Sun Sep 18 09:33:43 UTC 2022


On Tue, 13 Sep 2022 13:45:46 GMT, Abhishek Kumar <duke at openjdk.org> wrote:

>> JFileChooser - empty file size issue fixed. 
>> For empty file, now the size 0 KB.
>> Manual Test Case "FileSizeCheck.java" created.
>
> Abhishek Kumar has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Review comment fix

> > > So leaving aside what the native chooser does, we then just have to be consistent and round up.
> > > That's what the current version is trying to do isn't it ?
> > > Thoughts ?
> > 
> > 
> > Yeah, as per the current fix we are doing consistently round up for all file sizes.
> 
> Nearly.
> 
> It works correctly for KB:
> 
> ```
>       0      0.0 KB
>       1      0.1 KB
>      99      0.1 KB
>     100      0.1 KB
>     101      0.2 KB
>     900      0.9 KB
>     901      1.0 KB
> 
> 999,000    999.0 KB
> 999,001    999.1 KB
> 999,900    999.9 KB
> 999,901      1.0 MB
> ```
> 
> But the rounding is not right as soon as the size is larger than 1 MB:
> 
> ```
> 1,000,000    1.0 MB
> 1,000,001    1.0 MB
> 1,000,999    1.0 MB
> 1,001,000    1.1 MB
> ```
> 
> The kilobytes are ignored. The displayed size must be 1.1 MB for all the files but the first one.
> 
> And this is due to flooring the values by casting a double to long. The cast should be replaced with `Math.ceil`. The following patch resolves the problem:
> 
> ```diff
> diff --git a/src/java.desktop/share/classes/sun/swing/FilePane.java b/src/java.desktop/share/classes/sun/swing/FilePane.java
> index 91935f0ed00..acc7dad6927 100644
> --- a/src/java.desktop/share/classes/sun/swing/FilePane.java
> +++ b/src/java.desktop/share/classes/sun/swing/FilePane.java
> @@ -1194,7 +1194,7 @@ public class FilePane extends JPanel implements PropertyChangeListener {
>                  Icon icon = chooser.getIcon(file);
>                  setIcon(icon);
>  
> -            } else if (value instanceof Long len) {
> +            } else if (value instanceof final Long len) {
>                  /*
>                   * This code block is relevant to Linux.
>                   * File size is displayed up to 1 decimal precision.
> @@ -1211,19 +1211,17 @@ public class FilePane extends JPanel implements PropertyChangeListener {
>                      displayedFileSize[0] = roundToOneDecimalPlace(len);
>                  } else {
>                      double kbVal = roundToOneDecimalPlace(len);
> -                    len = (long) kbVal;
>                      if (kbVal < baseFileSize) {
>                          updateMessageFormatPattern(kiloByteString);
>                          displayedFileSize[0] = kbVal;
>                      } else {
> -                        double mbVal = roundToOneDecimalPlace(len);
> -                        len = (long) mbVal;
> +                        double mbVal = roundToOneDecimalPlace(Math.ceil(kbVal));
>                          if (mbVal < baseFileSize) {
>                              updateMessageFormatPattern(megaByteString);
>                              displayedFileSize[0] = mbVal;
>                          } else {
>                              updateMessageFormatPattern(gigaByteString);
> -                            displayedFileSize[0] = roundToOneDecimalPlace(len);
> +                            displayedFileSize[0] = roundToOneDecimalPlace(Math.ceil(mbVal));
>                          }
>                      }
>                  }
> @@ -1254,7 +1252,7 @@ public class FilePane extends JPanel implements PropertyChangeListener {
>           * @param fileSize the file size to round to one decimal place
>           * @return file size rounded to one decimal place
>           */
> -        private static double roundToOneDecimalPlace(long fileSize) {
> +        private static double roundToOneDecimalPlace(double fileSize) {
>              return Math.ceil(fileSize / 100.0d) / 10.0d;
>          }
>      }
> ```
> 
> When the above patch is applied to the latest code in the PR, it produces the correct result for MBs as shown above as well as for GBs:
> 
> ```
> 1,000,000,000    1.0 GB
> 1,000,000,001    1.1 GB
> ```

Updated the patch to latest commit and it shows correct result for MBs and GBs files as you mentioned above.

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

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



More information about the client-libs-dev mailing list