Tôi có thể xác nhận rằng việc chia tỷ lệ hình ảnh của bạn hoạt động trên Oracle Java 1.8. Tôi không thể nhận được NSImage
hack để làm việc trên java 1.7 hoặc 1.8.Tôi nghĩ rằng đây chỉ hoạt động với Java 6 từ Mac ...
Trừ khi ai đó có một giải pháp tốt hơn, những gì tôi làm là như sau:
Tạo hai bộ biểu tượng. Nếu bạn có biểu tượng chiều rộng 48pixel
, hãy tạo một số 48px
@normal DPI
và một số khác tại 96px
với 2x DPI
. Đổi tên hình ảnh 2xDPI
thành @2x.png
để phù hợp với tiêu chuẩn đặt tên của apple.
Phân lớp ImageIcon
và gọi số RetinaIcon
hoặc bất kỳ thứ gì. Bạn có thể kiểm tra cho một màn hình Retina như sau:
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;
}
Hãy chắc chắn để @Override
chiều rộng và chiều cao của lớp mới ImageIcon
như sau:
@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();
}
Một khi bạn có một bài kiểm tra cho màn hình võng mạc và tùy chỉnh phương pháp chiều rộng/chiều cao của bạn ghi đè bạn có thể tùy chỉnh các phương pháp painIcon
như sau:
@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();
}
tôi không biết làm thế nào điều này sẽ làm việc với nhiều màn hình mặc dù là có ai khác có thể giúp đỡ với điều đó?
Hy vọng mã này sẽ giúp bạn!
Jason Barraclough.
Dưới đây là một ví dụ của việc sử dụng rộng như đã đề cập ở trên: RetinaIcon is on the left. ImageIcon is on the right
Vui lòng chỉnh sửa câu hỏi của bạn để bao gồm [sscce] (http://sscce.org/) minh họa khu vực bạn quan tâm; chủ sở hữu màn hình mới của MacBook Pro có thể đăng ảnh [screenshot] (http://meta.stackexchange.com/questions/99734/how-do-i-create-a-screenshot-to-illustrate-a-post). – trashgod
BTW, biểu tượng 24x24 của bạn chỉ cần trở thành biểu tượng 48x48. Retina tăng gấp đôi độ phân giải trong mỗi kích thước, biến mỗi pixel thành bốn pixel. – MiguelMunoz