我有两个版本的图片: logo.png (265x150)和 logo@2x.png (530x300)。 第二个是视网膜版本。
在我的Java应用程序中,我有一个 JLabel ,我将背景设置为如下图像:
contentPane = new JPanel();
JLabel lblNewLabel = new JLabel("");
lblNewLabel.setBackground(Color.WHITE);
lblNewLabel.setBounds(9, 6, 265, 150);
lblNewLabel.setIcon(new ImageIcon("login_logo.png"));
contentPane.add(lblNewLabel);
这很好用,但我不确定如何在我的Macbook Pro Retina上正确显示视网膜版本。 视网膜图像未缩放,导致图像仅部分可见。
答案 0 :(得分:0)
我的个人意见是,首先检查视网膜显示,然后设置图像
Toolkit.getDefaultToolkit().getDesktopProperty("apple.awt.contentScaleFactor")
上述行将在视网膜显示屏上返回2.0。在非视网膜Mac上,它将返回1.0,在所有其他平台上返回null
尝试以下代码
public boolean isRatinaDisplay(){
boolean isRatina = false;
if (null != Toolkit.getDefaultToolkit().getDesktopProperty("apple.awt.contentScaleFactor") && Float.parseFloat((String) Toolkit.getDefaultToolkit().getDesktopProperty("apple.awt.contentScaleFactor")) == 2.0) {
//The above line will return 2.0 on retina displays.
//On non-retina macs it will returns 1.0 and on all other platforms null
isRatina = true;
}
}
JLabel lblLabel = new JLabel("");
if(isRatinaDisplay()){ //if mac set ratina image
lblLabel.setIcon(new ImageIcon("logo@2x.png"));
lblLabel.setSize(new Dimension(530,300));
lblLabel.setBounds(9, 6, 530,300);
}else{ //else normal
lblLabel.setSize(new Dimension(265, 150));
lblLabel.setIcon(new ImageIcon("logo.png"));
lblLabel.setBounds(9, 6, 265, 150);
}
答案 1 :(得分:0)
我认为,您使用的是不同尺寸/分辨率的两张图像。一个小的用于显示器的小分辨率,一个较大的用于具有更高分辨率的显示器。
视网膜显示器与其他显示器的区别主要在于其更高的分辨率。
因此,您可以尝试找出显示分辨率,并检查它与视网膜显示器匹配。有几种可能性。一个可能是这样的: How do you get the screen width in java?
但也许最好使用JFrame的大小,因为它可以是全屏模式或更小,用户可以更改它,只要你允许。 您可以通过以下方式确定JFrame的大小:http://docs.oracle.com/javase/6/docs/api/java/awt/Component.html#getSize()
另一个想法是:在不久的将来,将会有更多的公司,只有苹果,在该解决方案中提供显示。
问候!
答案 2 :(得分:0)
图像更大(在像素中的宽度和高度方面,而不是以英寸为单位),因此需要使JLabel更大(setBounds接受在中测量的参数)像素,而不是英寸。这在Javadocs中实际上没有记录,但是当你检查Javadocs setSize
)时很明显。
Java“像素”不是Apple视网膜显示器上的真实像素。见Swing and bitmaps on retina displays
此外,根据this answer,只有某些版本的Java支持视网膜显示。我不知道这是否与你的问题有关。