Swing中使用的框架图标的大小

我们可以使用一个列表来初始化使用Window.setIconImages(List<? extends Image>)的窗口图标。 在JFrame通常使用的不同大小的图标是什么?

此代码将64个不同大小的图像(从16×16,增加2)变成列表的图标。

 import java.awt.*; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.Vector; import javax.swing.*; import javax.swing.border.EmptyBorder; public class FrameIconList { public static BufferedImage getImage(int size, Color color) { BufferedImage i = new BufferedImage( size, size, BufferedImage.TYPE_INT_RGB); Graphics2D g = i.createGraphics(); g.setColor(color); g.fillRect(0, 0, size, size); g.setColor(Color.BLACK); int off = (size>17 ? 3 : 1); if (off>1) g.drawRect(0, 0, size-1, size-1); g.drawString("" + size, off, size-off); g.dispose(); return i; } public static void main(String[] args) { final Color[] colors = { Color.GREEN, Color.RED, Color.YELLOW, Color.WHITE, Color.CYAN, Color.MAGENTA, Color.PINK, Color.ORANGE }; int s = 64; final int[] sizes = new int[s]; for (int ii=0; ii<sizes.length; ii++) { sizes[ii] = 16+(ii*2); } Runnable r = new Runnable() { @Override public void run() { // the GUI as seen by the user (without frame) JPanel gui = new JPanel(new BorderLayout()); gui.setBorder(new EmptyBorder(2, 3, 2, 3)); gui.setBackground(Color.WHITE); ArrayList<BufferedImage> images = new ArrayList<BufferedImage>(); Vector<ImageIcon> icons = new Vector<ImageIcon>(); for (int ii=0; ii< sizes.length; ii++) { BufferedImage bi = getImage( sizes[ii], colors[ii%colors.length]); images.add(bi); ImageIcon imi = new ImageIcon(bi); icons.add(imi); } JList list = new JList(icons); list.setVisibleRowCount(6); gui.add(new JScrollPane(list)); JFrame f = new JFrame("Icon size usage"); f.setIconImages(images); f.add(gui); // Ensures JVM closes after frame(s) closed and // all non-daemon threads are finished f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); // See http://stackoverflow.com/a/7143398/418556 for demo. f.setLocationByPlatform(true); // ensures the frame is the minimum size it needs to be // in order display the components within it f.pack(); // should be done last, to avoid flickering, moving, // resizing artifacts. f.setVisible(true); } }; // Swing GUIs should be created and updated on the EDT // http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html SwingUtilities.invokeLater(r); } } 

这个基于Windows 7的PC的典型视图

注意:@bobbel报告在Windows 10中使用相同的大小。

帧 – 20×20

图标大小用法 - 显示20x20框架图标

任务栏 – 40×40任务栏本身,hover应用程序显示20×20

图标大小用法 - 任务栏

Windows + Tab – 20×20

图标大小用法 -  Windows +选项卡

Alt + Tab – 右下angular40x40,左上angular缩小20×20。

图标大小用法 -  Alt + Tab

任务pipe理器 – 20×20

图标大小用法 - 任务管理器

@mKorbel呃..没有意识到那里会有差别。 那么,用户/操作系统偏好规则超过程序员的期望! ;)

  • 答案只是关于Win8(ent,64b ….)/ WinXP(未提及,但设置相当类似)

  • 还有另外一个选项,请参阅Bug或function:Swing默认gui字体对于Win6 +而言是不正确的@kleopatra等

  • 可以在win8上设置桌面上的64×64图标

  • 例如我的设置(尽pipe事实上我是Win2008 / 12pipe理员, blablabla- “使用反向配色scheme的现实主义,现在只有黑色和橙色)”(不包括高级graphics个性化)

在这里输入图像描述

  • 发电

在这里输入图像描述

  • 标准设置(只有未标记使用小任务栏button)

在这里输入图像描述

  • 你的窗口在我的屏幕上

在这里输入图像描述

在Mac OS X 10.9(Mavericks)中运行时似乎没有Frame或Dock图标:

Mac OS X 10.9中缺少Java Swing图标(小牛)

另外,Activity Monitor中没有图标:

在这里输入图像描述

Ubuntu 12.04 LTS

任务栏图标大小可以在32到64之间更改,但是一直使用32×32图标。 我也重新编译了这个程序,但是一直使用相同的图标。

任务栏和窗口(窗口没有图标)。

在这里输入图像描述

Alt + Tab

在这里输入图像描述

在任务pipe理器没有图标

我在Win10上发现了一个有趣的事情(对于Win7和Win8也是如此,但我还没有尝试过)。

默认情况下,Win10将使用20×20(小)和40×40(大)的图像大小。

那么,如果你让图像大小在22 ? 它将使用图像尺寸30×30 (小)和40×40 (大)!

生成一个完整的表格显示有趣的行为(testing之间的起始大小之间的testing结果以前的大小,所以4也将导致20×2040×40 ):

如果从2开始,它将使用20×2040×40
如果你从22开始,它将使用30×3040×40
如果你从32开始,它将用于40×40
如果你从42开始,它将同时用于60×60
如果你从62开始,它将使用78×7880×80
如果从80开始,它将用于80×80
如果你从82开始,它将使用98×98120×120
如果你从100开始,它将使用100×100120×120
如果你从102开始,它将使用118×118120×120
如果你从120开始,它将用于120×120
如果你从122开始,它将使用138×138158×158
…好吧,这已经足够了…

我并没有真正掌握这种模式,但是我发现它非常有趣。

最后,这是真的取决于你,你提供的大小。 每个操作系统都有自己的逻辑来显示特定的图标。 如果您不为每个操作系统提供确切的图像大小,它将被放大或缩小。