如何在java中获得屏幕DPI?
我正在开发一款需要屏幕DPI的应用程序。。我查看了一些论坛,得到了如下代码片段:如何在java中获得屏幕DPI?,java,screen-resolution,Java,Screen Resolution,我正在开发一款需要屏幕DPI的应用程序。。我查看了一些论坛,得到了如下代码片段: Dimension screen = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); System.out.println("screen width: "+screen.getWidth()); System.out.println("screen height: "+screen.getHeight()); int pixelPerInch=jav
Dimension screen = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
System.out.println("screen width: "+screen.getWidth());
System.out.println("screen height: "+screen.getHeight());
int pixelPerInch=java.awt.Toolkit.getDefaultToolkit().getScreenResolution();
System.out.println("pixelPerInch: "+pixelPerInch);
double height=screen.getHeight()/pixelPerInch;
double width=screen.getWidth()/pixelPerInch;
double x=Math.pow(height,2);
double y=Math.pow(width,2);
import org.eclipse.swt.graphics.Device;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class MainClass {
public void run() {
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("Display Device");
createContents(shell);
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
private void createContents(Shell shell) {
Device device = shell.getDisplay();
System.out.println("getBounds(): "+ device.getBounds());
System.out.println("getClientArea(): "+device.getClientArea());
System.out.println("getDepth(): "+device.getDepth());
System.out.println("getDPI(): "+device.getDPI());
device.setWarnings(true);
System.out.println("Warnings supported: "+device.getWarnings());
}
public static void main(String[] args) {
new MainClass().run();
}
但无论我的屏幕分辨率值是多少,pixelPerInch的值保持不变,为96。代码有什么问题
我得到了另一个同样的swt
代码,如下所示:
Dimension screen = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
System.out.println("screen width: "+screen.getWidth());
System.out.println("screen height: "+screen.getHeight());
int pixelPerInch=java.awt.Toolkit.getDefaultToolkit().getScreenResolution();
System.out.println("pixelPerInch: "+pixelPerInch);
double height=screen.getHeight()/pixelPerInch;
double width=screen.getWidth()/pixelPerInch;
double x=Math.pow(height,2);
double y=Math.pow(width,2);
import org.eclipse.swt.graphics.Device;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class MainClass {
public void run() {
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("Display Device");
createContents(shell);
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
private void createContents(Shell shell) {
Device device = shell.getDisplay();
System.out.println("getBounds(): "+ device.getBounds());
System.out.println("getClientArea(): "+device.getClientArea());
System.out.println("getDepth(): "+device.getDepth());
System.out.println("getDPI(): "+device.getDPI());
device.setWarnings(true);
System.out.println("Warnings supported: "+device.getWarnings());
}
public static void main(String[] args) {
new MainClass().run();
}
但是这里,无论我的屏幕分辨率是多少,
getDPI()
返回相同的值96。。出什么事了??是我的代码错了还是我用错误的方式解释了它???问题是没有人,甚至操作系统,知道屏幕的确切物理尺寸。为了计算PPI,你需要知道这一点
控制面板中有一个显示设置,用户可以在其中手动指定PPI,默认设置为96。此代码在win10上适用于我
import javafx.stage.Screen
double getScaleFactor() {
double trueHorizontalLines = Toolkit.getDefaultToolkit().getScreenSize().getHeight();
double scaledHorizontalLines = Screen.getPrimary().getBounds().getHeight();
double dpiScaleFactor = trueHorizontalLines / scaledHorizontalLines;
return dpiScaleFactor;
}
它使用了一些
awt
api,尽管okay thanx。。那么,如果我想根据屏幕宽度和分辨率调整帧窗口大小,我该怎么办。。假设我希望我的框架窗口是5英寸宽,无论我的屏幕分辨率如何,我该怎么办?你有点卡住了。目前没有好的解决方案。您可以请求用户在显示控制面板(仅限Windows)中进行DPI校准;只需片刻。但是你不能依靠用户来完成。再过几年,看看苹果是否/何时能推出独立于分辨率的解决方案。这是我对触摸屏应用特别渴望的东西。恐怕没有管道让监视器向操作系统报告它们的大小,然后让操作系统向java提供。当然,使用投影仪和带有多显示器桌面渲染区域的多显示器等设备确实不容易,因此,很遗憾,必须依赖配置文件或用户输入。GraphicsConfiguration.GetNormalingTransform()在某种程度上不可用吗?这似乎是在PostScript维度和显示维度之间进行转换的转换。您从哪里获得的“Screen”类可能存在重复?它是来自于某种额外的依赖性吗?我在Java 1.8上看不到它,这在Windows HiDPI缩放打开时不起作用,因为Toolkit.getScreenSize()
将返回“虚拟”像素的大小,而不是屏幕像素。现在确定屏幕大小的唯一可靠方法是通过java.awt.GraphicsConfiguration#getBounds()
调用。javafx.stage.screen.getPrimary().getDpi()
?@Bass实际上GraphicsConfiguration#getBounds()
也会受到HiDPI缩放的影响。对于Java 8,当比例设置为150%时,1650x1080监视器显示为1120x700矩形。