2016-03-25 4 views
1

次のコードでは、画面サイズをピクセルで取得するためにjava.awt.GraphicsDevicejavafx.stage.Screenを使用しています。 Linuxでは、JavaFXが間違っているようです(Windows 7では正しい)。他の誰かが同じような見かけのバグを経験しているかどうかは知りたいです。私のシステム(UbuntuのMATE)でJavaFXは、Linux上で自分の画面サイズを誤って報告します。これはバグですか?

import javafx.application.Application; 
import javafx.stage.*; 
import java.awt.*; 

public class DisplayCheck extends Application { 

    static int getScreenWidthViaAWT(int screenNum) { 
     GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()[screenNum]; 
     return gd.getDisplayMode().getWidth(); 
    } 

    static int getScreenHeightViaAWT(int screenNum) { 
     GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()[screenNum]; 
     return gd.getDisplayMode().getHeight(); 
    } 

    static int getScreenWidthViaJavaFX(int screenNum) { 
     return (int)Screen.getScreens().get(screenNum).getVisualBounds().getWidth(); 
    } 

    static int getScreenHeightViaJavaFX(int screenNum) { 
     return (int)Screen.getScreens().get(screenNum).getVisualBounds().getHeight(); 
    } 

    public static void main(String[] args) { 

     int w0 = getScreenWidthViaAWT(0); 
     int h0 = getScreenHeightViaAWT(0); 
     int w1 = getScreenWidthViaAWT(1); 
     int h1 = getScreenHeightViaAWT(1); 

     System.out.println ("\n\nScreen sizes from java.awt.GraphicsDevice:\n\nScreen 0: " + w0 + " x " + h0 + "\nScreen 1: " + w1 + " x " + h1); 

     w0 = getScreenWidthViaJavaFX(0); 
     h0 = getScreenHeightViaJavaFX(0); 
     w1 = getScreenWidthViaJavaFX(1); 
     h1 = getScreenHeightViaJavaFX(1); 

     System.out.println ("\n\nScreen sizes from javafx.stage.Screen:\n\nScreen 0: " + w0 + " x " + h0 + "\nScreen 1: " + w1 + " x " + h1); 

     launch(args); 
    } 

    public void start (Stage stage) { 
     System.exit(0);  
    } 
} 

、JavaFXのは718個のピクセルと私のラップトップ画面と私の外部モニタの両方の高さを誤って報告。 AWTはそれを正しく取得します。結果は以下の通りである:あなたがScreen.getVisualBounds代わりのScreen.getBoundsを使用している

[email protected]:/java$ javac DisplayCheck.java 
[email protected]:/java$ java DisplayCheck 


Screen sizes from java.awt.GraphicsDevice: 

Screen 0: 1024 x 768 
Screen 1: 1920 x 1080 


Screen sizes from javafx.stage.Screen: 

Screen 0: 1920 x 718 
Screen 1: 1024 x 718 
[email protected]:/java$ 

答えて

1

。視覚的境界は、タスクバーが占める領域を除外します。これらの境界は、そのようなタスクバーやメニューバーなどのネイティブのウィンドウシステム内のオブジェクトを占める

Screen.getVisualBoundsのjavadocツールから

+0

OK、 'Screen.getBounds()'を呼び出すとサイズが正しくレポートされます。しかし、私はなぜ "視覚的境界"を得ることが "限界"から362ピクセルを引くべきなのだろうかと思います。この画面にはタスクバーやメニューなどはありません。また、AWTはスクリーンを別の方法で列挙します。 1920x1080は私のプライマリディスプレイですが、AWTは0ではなく1になります。@ fabianのおかげで私は正しい方法について訂正してくれました。 – John

関連する問題