我们可以使用列表使用Window.setIconImages(List<? extends Image>)
初始化窗口图标。 JFrame
中通常使用的图标大小有哪些?
此代码将64个不同大小的图像(从16x16,递增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);
}
}
答案 0 :(得分:30)
注意:@bobbel报告Windows 10使用相同的大小。
答案 1 :(得分:12)
@mKorbel嗯..没有意识到那里会有区别。 那么,用户/操作系统偏好规则超过了程序员的期望! ;)
回答只是关于Win8(ent,64b ....)/ WinXP(未提及,但设置非常类似)
还有其他选择请参阅@ Bug or feature: Swing default gui font incorrect for Win6+ @kleopatra等
可以在win8
e.g。我的设置(不是高级图形个性化,尽管事实上我是Win2008 / 12管理员,blablabla-
&#34;保留了使用反色方案的确定性,现在只使用Black&amp; Orange Colors&#34; { {1}})
答案 2 :(得分:11)
在Mac OS X 10.9(Mavericks)中运行时似乎没有Frame或Dock图标:
此外,活动监视器中没有图标:
答案 3 :(得分:10)
Ubuntu 12.04 LTS
任务栏图标大小可以在32到64之间更改,但始终使用32x32图标。我也重新编译了程序,但仍然使用相同的图标。
任务栏和窗口(窗口没有图标)。
Alt + Tab
任务管理员没有图标
答案 4 :(得分:2)
我在Win10上发现了一件有趣的事情(对于Win7和Win8来说也是如此,但我还没试过它。)
默认情况下,Win10将使用20x20(小)和40x40(大)的图像大小。
那么,如果你让你的图像尺寸 22 怎么办?它将使用 30x30 (小)和 40x40 (大)的图像尺寸!
生成一个完整的表格显示了有趣的行为(测试的起始大小之间的测试导致以前的大小;因此 4 也会导致 20x20 和 40x40 < /强>):
如果您从 2 开始,它将使用 20x20 和 40x40 。
如果您从 22 开始,它将使用 30x30 和 40x40 。
如果您从 32 开始,它将同时用于 40x40 。
如果您从 42 开始,它将同时用于 60x60 。
如果您从 62 开始,它将使用 78x78 和 80x80 。
如果您从 80 开始,它将同时用于 80x80 。
如果您从 82 开始,它将使用 98x98 和 120x120 。
如果您从 100 开始,它将使用 100x100 和 120x120 。
如果您从 102 开始,它将使用 118x118 和 120x120 。
如果您从 120 开始,它将用于 120x120 。
如果您从 122 开始,则会使用 138x138 和 158x158 。
......好吧这就够了......
我并没有真正掌握这种模式,但我发现它非常有趣......
最后,它取决于您,您提供的尺寸。每个操作系统都有自己的逻辑来显示特定的图标。如果您没有为每个操作系统提供确切的图像大小,它将被放大或缩小。
答案 5 :(得分:1)
这是我在 Windows 10 上的结果,它取决于屏幕缩放:
在 100% 时: 框架 - 16x16 任务栏 - 32x32
125% 框架 - 20x20 任务栏 - 40x40
150% 帧 - 24x24 任务栏 - 48x48
175% 框架 - 28x28 任务栏 - 56x56
200% 框架 - 32x32 任务栏 - 64x64