2K显示器上的JFileChooser图标

9

你有没有想到如何在 Windows 的字体缩放大于 125% 的 2K 显示器上改善 Java Swing 文件选择器的外观呢?

我使用的是普通的代码,例如:

JFileChooser fc = new JFileChooser();
if (settings.currentdir != null)
   fc.setCurrentDirectory(new File(settings.currentdir));
int returnVal = fc.showOpenDialog((Window) holder);
if (returnVal == JFileChooser.APPROVE_OPTION) {

但是文件选择器只显示列出的文件和目录的小图标。我正在使用JDK 8,出了什么问题?
附言:问题的范围仅限于Windows,而不是Unix。在Windows上,两个默认的L&F,它们会缩放字体。但它们不会缩放图标。应用程序必须这样做,因为它可能会针对更高的比例使用不同的位图资源。看起来JFileChooser没有这样编码。
但是可能JFileChooser可以被指示这样做。我没有看到其他问题解决图标大小和Windows上的JFileChooser的情况:如何设置Java Swing应用程序在Windows/Linux上的DPI? 其他问题处理字体大小,在具有两个Windows L&F之一的Windows上,这不是JFileChooser的问题。

据我所知,目前还不可能。请在http://bugreport.java.com上提交错误/请求功能的报告。 - Hendrik
3个回答

0

我最近遇到了同样的问题。唯一的解决方法是不使用Java内置的ImageIcon类,而是自己编写一个。 这个类会将提供的图像缩放以适应当前组件大小并进行绘制。我尽可能地让它简单,并且与原始类尽可能接近,但它并不完美,需要改进,特别是在组件图标对齐方面。

    import java.awt.Component;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.RenderingHints;
    import java.awt.geom.AffineTransform;
    import javax.swing.AbstractButton;
    import javax.swing.ImageIcon;
    
    /**
     *
     * @author Rastislav
     */
    public class ScaleToFitAndAntialiasIcon extends ImageIcon{
        private ImageIcon icon;
        
        
        
    
        public ScaleToFitAndAntialiasIcon(ImageIcon icon)
        {
            this.icon = icon;
        }
    
        public int getIconWidth()
        {
            return icon.getIconWidth();
        }
    
        public int getIconHeight()
        {
            return icon.getIconHeight();
        }
    
        @Override
        public void paintIcon(Component c, Graphics g, int x, int y)
        {
            Graphics2D g2d = (Graphics2D)g.create();
            AffineTransform at = g2d.getTransform();
            
            double scaleToFit = ((double)c.getHeight() / (double)icon.getIconHeight());
            
            
            if((int)icon.getIconHeight()*scaleToFit == c.getHeight()){
                scaleToFit = ((double)c.getHeight() / (double)icon.getIconHeight()) - 0.1;
            }
    
            AffineTransform scaled = AffineTransform.getScaleInstance(scaleToFit, scaleToFit);
            at.concatenate( scaled );
            g2d.setTransform( at );
            
//need improvement
           /* int lineupMinus = (int)((double)icon.getIconWidth() *((double)c.getHeight() / (double)icon.getIconHeight()));
            int lineup = (int)((double)icon.getIconWidth() * scaleToFit);
            
            int ff = (int)(lineupMinus - lineup);
            System.out.println(ff);
            */
            
            g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
            g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
//improved code goes here
            icon.paintIcon(c, g2d, x, 4);
            
            
            
            
            if(c instanceof AbstractButton a){
                a.setIconTextGap((int)(-icon.getIconWidth()/2));
            }
            
            
            
            g2d.dispose();
        }
    
    
    }

0
Java 8不支持高DPI,其用户界面会被Windows放大到正确的尺寸。然而,这意味着界面会变得模糊。
Java 11及更高版本支持高DPI,在高DPI环境中,如果图标不是提供不同显示比例的MultiResolutionImage的图标,Java会将JFileChooser中的图标放大。在Java 17中,文件选择器使用的大多数图标都是多分辨率图标。

0

在我看到这个帖子时,有一个快速的想法。你可以尝试提供自己的图标集:

new JFileChooser().setFileView(new FileView() {
        @Override
        public Icon getIcon(File f) {
            return fancy2kIconForExtension(StringUtils.substringAfterLast("."));
        }
    });

注意从缓存中加载您的图标,因为这种方法经常从JFileChooser内部调用,否则您将不断重新加载图标。


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - user502187

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接