0

Linux 環境の 2 つの画面に関する情報を決定する必要があるデスクトップ Java アプリケーション (Java 1.4.2) があります。

# cat /etc/redhat-release
Red Hat Enterprise Linux WS release 4 (Nahant Update 7)
# lsb_release
cat /proc/versionLSB Version:   
:core-3.0-ia32:core-3.0-noarch:graphics-3.0-ia32:graphics-3.0-noarch
# cat /proc/version
Linux version 2.6.9-78.ELsmp (brewbuilder@hs20-bc2-3.build.redhat.com) 
(gcc version 3.4.6 20060404 (Red Hat 3.4.6-10)) #1 SMP Wed Jul 9 15:39:47 EDT 2008

画面は 2048x2048 と 1600x1200 です。

コードは

GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] allScreens = env.getScreenDevices();
log("=============================================");
log("Total num. of screen = " + allScreens.length);
for (int i = 0; i < allScreens.length; i++) {
    log("--------------------------------------");

    log(
        allScreens[i].getIDstring() + " width: " + allScreens[i].getDisplayMode().getWidth() + 
        " - height: " + allScreens[i].getDisplayMode().getHeight());

    GraphicsConfiguration dgc =
        allScreens[i].getDefaultConfiguration();
    Rectangle bounds = dgc.getBounds();
    Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(dgc);
    log("Bounds: " + bounds);
    log("Insets: " + insets);

    log("--------------------------------------");
}
log("=============================================");

しかし、出力は

=============================================
Total num. of screen = 2
--------------------------------------
:0.0 width: 2048 - height: 2048
Bounds: java.awt.Rectangle[x=0,y=0,width=2048,height=2048]
Insets: java.awt.Insets[top=0,left=0,bottom=0,right=0]
--------------------------------------
--------------------------------------
:0.1 width: 2048 - height: 2048
Bounds: java.awt.Rectangle[x=0,y=0,width=1600,height=1200]
Insets: java.awt.Insets[top=0,left=0,bottom=0,right=0]
--------------------------------------
=============================================

画面 :0.1 は、allScreens[i].getDisplayMode() を使用する場合は 2048x2048 であり、getDefaultConfiguration().getBounds() を使用する場合は 1600x1200 です。

なぜ結果が異なるのですか?

getDisplayMode() の API コードは次のとおりです。

public DisplayMode getDisplayMode() {
    GraphicsConfiguration gc = getDefaultConfiguration();
    Rectangle r = gc.getBounds();
    ColorModel cm = gc.getColorModel();
    return new DisplayMode(r.width, r.height, cm.getPixelSize(), 0);
}

したがって、値は同じである必要があります。なぜ異なるのですか?

ありがとう

4

1 に答える 1

0

これは、フロント GUI がマルチモニター環境のさまざまなモニターに適合する必要がある自分のアプリケーションでも気づいたことです。問題はビデオ カードに関連するものです。Intel ビデオ カードは、allScreens[i].getDisplayMode() を使用する場合、基本的にプライマリの異なるモニターに対して同じ幅と高さを表示しますが、NVidia と ATI(AMD) ones は、同じ関数を使用する各モニターに対応する実際の解像度値を示します。

したがって、ビデオ カードに関係なく、マルチ モニター環境で各モニターの適切な解像度を取得する適切な方法は、getDefaultConfiguration().getBounds().width または height を使用することです。

それが役に立てば幸い。

于 2014-01-23T15:46:03.910 に答える