Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.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中获得屏幕DPI?_Java_Screen Resolution - Fatal编程技术网

如何在java中获得屏幕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

我正在开发一款需要屏幕DPI的应用程序。。我查看了一些论坛,得到了如下代码片段:

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矩形。