Mogę potwierdzić, że skalowanie obrazów działa na Oracle Java 1.8. Nie mogę uzyskać hackowania NSImage
do pracy w java 1.7 lub 1.8.Myślę, że to działa tylko z Java 6 z Mac ...
Chyba że ktoś ma lepsze rozwiązanie, co robię jest następujący:
Utwórz dwa zestawy ikon. Jeśli masz ikonę szerokości 48pixel
, utwórz jedną 48px
@normal DPI
, a drugą na 96px
z 2x DPI
. Zmień nazwę obrazu 2xDPI
na @2x.png
, aby była zgodna ze standardami nazewnictwa Apple.
Podklasa ImageIcon
i nazwać ją RetinaIcon
lub coś podobnego. można przetestować na wyświetlaczu Retina następująco:
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;
}
Upewnij się @Override
szerokość i wysokość nowego ImageIcon
klasy następująco:
@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();
}
Gdy masz test na ekranie siatkówki i niestandardowe metody szerokość/wysokość nadpisane można dostosować metodę painIcon
następująco:
@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();
}
i nie wiem, jak to będzie działać z wieloma ekranami - czy jest ktoś, kto może w tym pomóc?
Mam nadzieję, że ten kod i tak pomoże!
Jason Barraclough.
Oto przykład użycia skalowanie jak wspomniano powyżej: RetinaIcon is on the left. ImageIcon is on the right
Edytuj swoje pytanie, dołączając [sscce] (http://sscce.org/), które ilustruje twój obszar zainteresowania; nowy właściciel wyświetlaczy Retina MacBook Pro może opublikować zrzut ekranu (http://meta.stackexchange.com/questions/99734/how-do-i-create-a-screenshot-to-illustrate-a-post). – trashgod
BTW, twoja ikona 24x24 musi tylko stać się ikoną 48x48. Retina podwaja rozdzielczość w każdym wymiarze, który zamienia każdy piksel na cztery piksele. – MiguelMunoz