知道如何制作 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 之一。
只是我遇到这个帖子时的一个快速想法。您可以尝试提供自己的图标集:
new JFileChooser().setFileView(new FileView() {
@Override
public Icon getIcon(File f) {
return fancy2kIconForExtension(StringUtils.substringAfterLast("."));
}
});
从缓存加载图标时要小心,因为这个方法经常从内部调用
JFileChooser
,否则你最终会一直重新加载图标。
我最近遇到了同样的问题。唯一的解决方法是不在 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();
}
}
Java 8 不支持 High DPI,其 UI 被 Windows 放大到正确的尺寸。但这意味着用户界面是模糊的。
Java 11及更高版本支持高DPI,如果图标不是在高DPI环境下为不同显示比例提供不同图标的
JFileChooser
,则
MultiResolutionImage
中的图标将被Java放大。在 Java 17 中,文件选择器使用的大多数图标都是多分辨率图标。