2K 显示器上的 JFileChooser 图标

问题描述 投票:0回答:3

知道如何制作 Java Swing 文件选择器 在 2K 显示器上看起来更好,其中窗口 字体缩放 > 125%?

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

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。出了什么问题?

P.S.:问题的范围仅限于Windows,而不是 Unix。在 Windows 上,两个默认的 L&F,它们 缩放字体。但他们不缩放图标。这 应用程序必须这样做,因为它可能会使用 更高比例的不同位图资源。 JFileChooser 似乎不是这样编码的。

但是 JFileChooser 可能是 指示这样做。我不认为 其他问题涉及图标大小和 Windows 上的 JFileChooser:如何在 Windows/Linux 上设置 Java Swing 应用程序的 DPI? 另一个问题涉及字体大小,即 对于 Windows 上的 JFileChooser 来说不是问题 两个 Windows L&F 之一。

java windows swing jfilechooser
3个回答
0
投票

只是我遇到这个帖子时的一个快速想法。您可以尝试提供自己的图标集:

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

从缓存加载图标时要小心,因为这个方法经常从内部调用

JFileChooser
,否则你最终会一直重新加载图标。


0
投票

我最近遇到了同样的问题。唯一的解决方法是不在 ImageIcon 类中使用 java 构建,而是自己编写一个, 该图像获取了提供的图像,将其缩放以适合当前的组件尺寸并对其进行绘制。我试图使其尽可能简单并尽可能接近原始类,但它并不完美,需要改进,特别是在组件图标对齐方面

    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 不支持 High DPI,其 UI 被 Windows 放大到正确的尺寸。但这意味着用户界面是模糊的。

Java 11及更高版本支持高DPI,如果图标不是在高DPI环境下为不同显示比例提供不同图标的

JFileChooser
,则
MultiResolutionImage
中的图标将被Java放大。在 Java 17 中,文件选择器使用的大多数图标都是多分辨率图标。

© www.soinside.com 2019 - 2024. All rights reserved.