2011-07-01 16 views
6

Sto sviluppando un app per il quale ho bisogno dello schermo DPI .. Ho controllato alcuni forum e ottenuto un frammento di codice che va come segue:Come ottenere lo schermo DPI in 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); 

Ma qualunque sia il valore della mia risoluzione dello schermo, il pixelPerInch il valore rimane lo stesso a 96. Qual è il problema con il codice ??

ho avuto un altro codice swt per la stessa cosa, che va come segue:

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

Ma ancora una volta anche qui, qualunque sia la risoluzione dello schermo, il getDPI() restituisce lo stesso valore di 96 .. cosa c'è di sbagliato? ? Il mio codice è sbagliato o lo sto interpretando in modo sbagliato ??

+0

possibile duplicato di [Come "correttamente" rilevare DPI di visualizzazione con Java?] (http://stackoverflow.com/questions/4707756/how-to-correctly-detect-dpi-of-display-with -java) – uckelman

risposta

5

Il problema non è nessuno, nemmeno il sistema operativo, conosce le esatte dimensioni fisiche dello schermo. Dovresti saperlo per calcolare il PPI.

C'è un'impostazione di visualizzazione nel pannello di controllo in cui l'utente può specificare manualmente il PPI e di default è impostato a 96.

+0

ok grazie .. Quindi cosa devo fare se voglio per adattare le dimensioni della finestra Frame in base alla larghezza e alla risoluzione dello schermo. Supponiamo di volere che la finestra Frame sia larga 5 pollici qualunque sia la risoluzione dello schermo, cosa devo fare ?? – coder

+1

Sei un po 'bloccato. Non c'è una buona soluzione, al momento. Puoi chiedere all'utente di passare attraverso la calibrazione DPI nel pannello di controllo Display (solo Windows); ci vuole solo un attimo Ma non puoi fare affidamento sull'utente per farlo. Ricontrolla tra qualche anno se/quando Apple riuscirà a ottenere la soluzione indipendente dalla risoluzione. –

+0

Qualcosa che ho desiderato troppo in particolare per le app touch screen. Paura che la pipeline non sia lì per i monitor che segnalano le loro dimensioni al sistema operativo e quindi hanno il sistema operativo fornirlo a Java. Ovviamente non è facile con cose come proiettori e display multipli con un'area di rendering desktop multi-monitor, quindi Alas deve fare affidamento su un file di configurazione o input dell'utente. – peterk

0

Questo codice funziona per me su win10

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

utilizza alcuni awt apis sebbene