Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 视网膜兼容JLabel图像_Java_Retina Display - Fatal编程技术网

Java 视网膜兼容JLabel图像

Java 视网膜兼容JLabel图像,java,retina-display,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); lblN

我有两个版本的图像: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);
这工作正常,但我不确定如何在我的MacBookPro视网膜上正确显示视网膜版本。
视网膜图像未缩放,导致图像仅部分可见。

我个人的意见是,首先检查视网膜显示,然后设置图像

 Toolkit.getDefaultToolkit().getDesktopProperty("apple.awt.contentScaleFactor")
在视网膜显示器上,上述行将返回2.0。在非视网膜Mac上,它将返回1.0,在所有其他平台上为空

尝试以下代码

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);
}

我认为,您正在使用两个不同大小/分辨率的图像。小的用于小分辨率的显示器,大的用于高分辨率的显示器

视网膜显示器与其他显示器的主要区别在于其更高的分辨率

因此,您可以尝试找出显示分辨率,并检查它是否与视网膜显示匹配。有几种可能做到这一点。其中之一可能是:

但也许最好使用JFrame的大小,因为它可以是FullScreen模式,或者更小,用户可以更改它,只要您允许。 JFrame的大小可以通过以下方式确定:

另一个想法是:在不久的将来,将有更多的公司在该解决方案中提供显示器,而不仅仅是苹果

你好

图像更大(以像素为单位的宽度和高度,而不是英寸),因此需要将JLabel变大(setBounds采用以像素为单位的参数,而不是以英寸为单位。这在Javadocs中没有实际记录,但在检查Javadocs中的
setSize
时很明显)

Java“像素”在苹果视网膜显示器上不是真正的像素。看



此外,据了解,只有某些版本的Java支持视网膜显示。我不知道这是否与您的问题有关。

因此,您希望检测您是否在带有视网膜显示器的计算机上运行。这是你真正的问题,不是吗?@RobinGreen不,我需要一种在视网膜显示器上显示(视网膜)图像的正确方法。视网膜显示器的png文件与任何其他png文件基本上没有区别。只有为视网膜显示设计的图像。所以我不明白你的问题是什么。为什么不能直接更改文件名?简单地更改文件名是不行的。视网膜图像没有缩放,因此图像只能部分可见。虽然来回观看很有趣,这是一种学习体验,但毫无疑问,一个更通用的解决方案怎么样?我有一个高分辨率的显示器,希望你不要因为我运行Linux而在我的显示器上显示分辨率较低的文件。我用来写这行的mac没有视网膜显示器;-)谢谢你的方法,但是简单地将图标设置为一个更大的图像是不行的。该图像未通过Java缩放,因此只有一半可见。设置其他属性以缩放图像,它将根据分辨率更改标签尺寸更新代码尝试此操作,我没有测试此代码,因为我没有带视网膜显示器的Mac这不是我的问题;我很清楚视网膜显示器是什么。关键是:我需要在我的JLabel组件中正确显示高分辨率图像(视网膜版本!)。@Jeffrey你的态度似乎是我们都忽略了这一点。我认为情况正好相反。我想你需要放慢脚步,深呼吸,仔细阅读我们的发言。@Jeffrey:你能解释一下png的视网膜版本到底是什么吗?我想这就是我所缺少的…@杰弗里:你说的“财产展示”是什么意思?啊,对不起。。。如果我现在理解正确,您可以尝试在作为JLabel父容器的容器上调用doLayout()。这将重新显示容器及其所有子容器,以便重新计算子容器的大小。但这只有在初始创建对话框后更改图像时才有意义……正确显示时,以英寸为单位的大小确实相同,但没有正确显示,因此仍然是大小的两倍(以像素和英寸为单位)。据我所知,
setSize
以像素为参数。据我所知,只有某些版本的Java支持视网膜显示。我不知道这是否与您的问题有关。其他组件(如JLabel)显示良好,因此Java版本不是问题所在。