我可以确认您的图像缩放适用于 Oracle Java 1.8。我无法让NSImage
黑客在 java 1.7 或 1.8 上工作。我认为这只适用于Mac的Java 6 ...
除非其他人有更好的解决方案,否则我所做的如下:
创建两组图标。如果您有一个48pixel
宽度图标,请创建一个48px
@normalDPI
和另一个 at 96px
with 2x DPI
。重命名2xDPI
图像@2x.png
以符合苹果命名标准。
子类化ImageIcon
并调用它RetinaIcon
或其他任何东西。您可以按如下方式测试 Retina 显示屏:
public static boolean isRetina() {
boolean isRetina = false;
GraphicsDevice graphicsDevice = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
try {
Field field = graphicsDevice.getClass().getDeclaredField("scale");
if (field != null) {
field.setAccessible(true);
Object scale = field.get(graphicsDevice);
if(scale instanceof Integer && ((Integer) scale).intValue() == 2) {
isRetina = true;
}
}
}
catch (Exception e) {
e.printStackTrace();
}
return isRetina;
}
确保@Override
新类的宽度和高度ImageIcon
如下:
@Override
public int getIconWidth()
{
if(isRetina())
{
return super.getIconWidth()/2;
}
return super.getIconWidth();
}
@Override
public int getIconHeight()
{
if(isRetina())
{
return super.getIconHeight()/2;
}
return super.getIconHeight();
}
一旦您对视网膜屏幕进行了测试并且您的自定义宽度/高度方法被覆盖,您可以painIcon
按如下方式自定义该方法:
@Override
public synchronized void paintIcon(Component c, Graphics g, int x, int y)
{
ImageObserver observer = getImageObserver();
if (observer == null)
{
observer = c;
}
Image image = getImage();
int width = image.getWidth(observer);
int height = image.getHeight(observer);
final Graphics2D g2d = (Graphics2D)g.create(x, y, width, height);
if(isRetina())
{
g2d.scale(0.5, 0.5);
}
else
{
}
g2d.drawImage(image, 0, 0, observer);
g2d.scale(1, 1);
g2d.dispose();
}
我不知道这将如何在多个屏幕上工作——还有其他人可以帮忙吗???
希望这段代码能有所帮助!
杰森·巴拉克劳。
这是使用上述缩放的示例:
RetinaIcon 在左侧。ImageIcon 在右侧