デフォルト画面の DPI を呼び出しToolkit.getDefaultToolkit().getScreenResolution()
て取得できることはわかっていますが、接続した他のモニターで同じ情報を取得する方法が一生見つかりません。Toolkit
他のモニターの取得方法、またはそれらのモニターの DPI を取得するためのデバイスの呼び出しのいずれかを教えてもらえますか?
3 に答える
これにはいくつかの問題があります。理論的な点から始めましょう。
DPI (実際には PPI) は、幅と高さに対して別々に計算されます。
DPI x = 画面の幅 / 解像度x
DPI y = 画面の高さ / 解像度y
DPI x = DPI y (画面の縦横比が解像度と同じ場合に発生) の場合、単一の DPI 値がありますが、これは強制されません。したがって、単一の DPI 値を使用する場合は注意が必要です。
これは、2 番目の問題につながります。物理的な画面サイズは、通常はアクセスできず、常にわかっているわけでもありません。Javaでそれを行うには、この質問とこの質問を参照してください。
を実装する 2 つのツールキット実装があります。UnixgetScreenResolution()
システムはXToolkit
(X11 ウィンドウ システムに基づく) を使用し、Windows システムは を使用しWToolkit
ます。
- どちらも、取得する数値であるDPI xのみを計算します。
- どちらも
native
方法を使用して OS から情報を取得しようとしますが、その情報は信頼できません。この質問を参照してください。通常はデフォルト値が返されますが、これは 96 のようです。 WToolkit
の javadoc は、 DPI xを取得するときに明示的に指定します。画面幅に沿った論理インチあたりのピクセル数を返します。複数のディスプレイ モニターがあるシステムでは、この値はすべてのモニターで同じです。
そこでマルチモニタープランです。
XToolkit
そのメソッドのjavadocさえしません。
結論として、私はgetScreenResolution()
どのディスプレイやオペレーティング システムも信用しません。安全に取得できるのは解像度 (考えられるすべての解像度、リフレッシュ レート、色深度など) であり、関連する場合は物理的なサイズ データを入力するようにユーザーに依頼します。「画面サイズ」を変更できるプロジェクターを使用できることを忘れないでください。それ以外の場合は、ドライバーがその有効な情報を持っていることを期待して、ドライバーと直接やり取りする必要がありますが、これは保証されていません。
編集: デバイスの解像度をピクセル単位で取得するには、次を使用します。
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] gds = ge.getScreenDevices();
for (GraphicsDevice gd : gds) {
DisplayMode dm = gd.getDisplayMode();
int h = dm.getHeight();
int w = dm.getWidth();
System.out.println(w + "x" + h);
// or
GraphicsConfiguration gc = gd.getDefaultConfiguration();
Rectangle rec = gc.getBounds();
System.out.println(rec.width + "x" + rec.height);
}
デバッグに時間を費やした後、答えが見つかりました。X と Y の解像度 (xResolution、yResolution) のグラフィックス デバイスには、必要なものを提供するフィールドがあります)。