java获取系统dpi,如何从Java代码中找到实际显示密度(DPI)?

I'm going to do some low-level rendering stuff, but I need to know real display DPI for making everything of correct size.

I've found one way to do this:

java.awt.Toolkit.getDefaultToolkit().getScreenResolution() — but it returns incorrect result on OS X with "retina" display, it's 1/2 of the real DPI. (In my case it should be 220, but it's 110)

So either some other, more correct API must be available, or alternatively I need to implement a hack just for OS X — somehow find if the current display is "retina". But I couldn't find any way to query for this information too. There's this answer but on my machine Toolkit.getDefaultToolkit().getDesktopProperty("apple.awt.contentScaleFactor") just returns null.

How can I do it?

解决方案

Looks like it's currently possible to get it from java.awt.GraphicsEnvironment. Here's commented code example which does work on latest JDK (8u112).

// find the display device of interest

final GraphicsDevice defaultScreenDevice = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();

// on OS X, it would be CGraphicsDevice

if (defaultScreenDevice instanceof CGraphicsDevice) {

final CGraphicsDevice device = (CGraphicsDevice) defaultScreenDevice;

// this is the missing correction factor, it's equal to 2 on HiDPI a.k.a. Retina displays

final int scaleFactor = device.getScaleFactor();

// now we can compute the real DPI of the screen

final double realDPI = scaleFactor * (device.getXResolution() + device.getYResolution()) / 2;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值