2011-07-01 23 views
6

Estoy desarrollando una aplicación para el cual necesito DPI la pantalla .. he comprobado algunos foros y consiguió un fragmento de código que va de la siguiente manera:¿Cómo obtener la pantalla DPI en Java?

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

Pero cualquiera que sea el valor de la resolución de la pantalla, la pixelPerInch el valor sigue siendo el mismo en 96. ¿Cuál es el problema con el código?

que tiene otro código swt por la misma cosa que va de la siguiente manera:

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

Pero de nuevo aquí también cualquiera que sea mi resolución de la pantalla, la getDPI() devuelve el mismo valor de 96 .. lo que va mal? ? ¿Está mal mi código o lo estoy interpretando de manera incorrecta?

+0

posible duplicado de [¿Cómo detectar "correctamente" el DPI de la pantalla con Java?] (http://stackoverflow.com/questions/4707756/how-torectually-detect-dpi-of-display-with -java) – uckelman

Respuesta

5

El problema es que nadie, ni siquiera el sistema operativo, conoce las dimensiones físicas exactas de la pantalla. Necesitarías saber eso para calcular el PPI.

Hay una configuración de pantalla en el panel de control donde el usuario puede especificar manualmente el PPI y por defecto se configura en 96.

+0

okay gracias ... Entonces, ¿qué debo hacer si quiero para ajustar el tamaño de mi ventana de Marco de acuerdo con el ancho y la resolución de la pantalla ... Supongamos que quiero que mi ventana de Marco tenga 5 pulgadas de ancho sea cual sea la resolución de mi pantalla, ¿qué debo hacer? – coder

+1

Estás un poco atascado. No hay una buena solución, actualmente. Puede pedir al usuario que realice la calibración DPI en el panel de control de Pantalla (solo Windows); solo toma un momento. Pero no puede confiar en que el usuario lo haga. Vuelva a verificar en algunos años si/cuando Apple alguna vez obtiene su solución de independencia de resolución funcionando. –

+0

Algo que he deseado demasiado especialmente para aplicaciones de pantalla táctil. Teme que la tubería no esté ahí para que los monitores informen su tamaño al sistema operativo y que el sistema operativo lo proporcione a Java. Por supuesto, realmente no es fácil con cosas como proyectores y pantallas múltiples con un área de renderizado de escritorio de monitores múltiples, por lo que Alas tiene que confiar en un archivo de configuración o entrada de usuario. – peterk

0

Este código funciona para mí en win10

double getScaleFactor() { 
    double trueHorizontalLines = Toolkit.getDefaultToolkit().getScreenSize().getHeight(); 
    double scaledHorizontalLines = Screen.getPrimary().getBounds().getHeight(); 
    double dpiScaleFactor = trueHorizontalLines/scaledHorizontalLines; 
    return dpiScaleFactor; 
} 

que utiliza algunos awt apis aunque

Cuestiones relacionadas