视网膜兼容的JLabel图像

时间:2013-12-01 18:01:08

标签: java retina-display

我有两个版本的图片: 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上正确显示视网膜版本。 视网膜图像未缩放,导致图像仅部分可见。

3 个答案:

答案 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支持视网膜显示。我不知道这是否与你的问题有关。