ฉันจะรับความละเอียดหน้าจอใน java ได้อย่างไร?


136

หนึ่งจะได้รับความละเอียดหน้าจอ (กว้าง x สูง) เป็นพิกเซลได้อย่างไร

ฉันกำลังใช้ JFrame และวิธีการแกว่ง java


2
คุณสามารถให้รายละเอียดเพิ่มเติมเกี่ยวกับสิ่งที่คุณถามหนึ่งซับสามารถนำไปสู่วิธีที่แตกต่างกันหลายร้อย
Anil Vishnoi

7
ฉันเดาว่าคุณไม่สนใจการตั้งค่าจอภาพหลายจอ ดูเหมือนว่านักพัฒนาแอปพลิเคชันจำนวนมากจะไม่สนใจสิ่งเหล่านี้ ทุกคนใช้จอภาพหลายจอในที่ที่ฉันทำงานดังนั้นเราจึงต้องคิดถึงมันเสมอ เราตรวจสอบจอภาพทั้งหมดและตั้งค่าเป็นวัตถุหน้าจอเพื่อให้เราสามารถกำหนดเป้าหมายได้เมื่อเราเปิดเฟรมใหม่ หากคุณไม่ต้องการฟังก์ชั่นนี้จริงๆฉันคิดว่ามันโอเคที่คุณจะถามคำถามปลายเปิดและตอบรับอย่างรวดเร็ว
Erick Robertson

คำตอบ:


267

คุณสามารถรับขนาดหน้าจอด้วยToolkit.getScreenSize()วิธีการ

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
double width = screenSize.getWidth();
double height = screenSize.getHeight();

ในการกำหนดค่าหลายจอภาพคุณควรใช้สิ่งนี้:

GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
int width = gd.getDisplayMode().getWidth();
int height = gd.getDisplayMode().getHeight();

หากคุณต้องการที่จะได้รับความละเอียดหน้าจอใน DPI คุณจะต้องใช้วิธีการในการgetScreenResolution()Toolkit


ทรัพยากร:


4
มันไม่ได้ผลสำหรับฉัน ฉันมีมอนิเตอร์ 3840x2160 แต่ให้getScreenSizeผลตอบแทน 1920x1080
ZhekaKozlov

15

รหัสนี้จะระบุอุปกรณ์กราฟิกในระบบ (หากมีการติดตั้งจอภาพหลายจอ) และคุณสามารถใช้ข้อมูลนั้นเพื่อกำหนดความสัมพันธ์ของจอภาพหรือตำแหน่งอัตโนมัติ (บางระบบใช้จอภาพด้านข้างเล็กน้อยสำหรับการแสดงผลตามเวลาจริงขณะที่แอปทำงานอยู่ พื้นหลังและจอภาพดังกล่าวสามารถระบุได้ตามขนาดสีของหน้าจอ ฯลฯ ):

// Test if each monitor will support my app's window
// Iterate through each monitor and see what size each is
GraphicsEnvironment ge      = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[]    gs      = ge.getScreenDevices();
Dimension           mySize  = new Dimension(myWidth, myHeight);
Dimension           maxSize = new Dimension(minRequiredWidth, minRequiredHeight);
for (int i = 0; i < gs.length; i++)
{
    DisplayMode dm = gs[i].getDisplayMode();
    if (dm.getWidth() > maxSize.getWidth() && dm.getHeight() > maxSize.getHeight())
    {   // Update the max size found on this monitor
        maxSize.setSize(dm.getWidth(), dm.getHeight());
    }

    // Do test if it will work here
}


3

นี่คือความละเอียดของหน้าจอที่มีการกำหนดองค์ประกอบที่กำหนดไว้ในปัจจุบัน (บางอย่างเช่นส่วนใหญ่ของหน้าต่างรูทจะปรากฏบนหน้าจอนั้น)

public Rectangle getCurrentScreenBounds(Component component) {
    return component.getGraphicsConfiguration().getBounds();
}

การใช้งาน:

Rectangle currentScreen = getCurrentScreenBounds(frameOrWhateverComponent);
int currentScreenWidth = currentScreen.width // current screen width
int currentScreenHeight = currentScreen.height // current screen height
// absolute coordinate of current screen > 0 if left of this screen are further screens
int xOfCurrentScreen = currentScreen.x

หากคุณต้องการเคารพแถบเครื่องมือ ฯลฯ คุณจะต้องคำนวณด้วยเช่นกัน:

GraphicsConfiguration gc = component.getGraphicsConfiguration();
Insets screenInsets = Toolkit.getDefaultToolkit().getScreenInsets(gc);

3

นี่คือโค้ดฟังก์ชัน (Java 8) ที่คืนค่าตำแหน่ง x ของขอบขวาสุดของหน้าจอด้านขวาสุด หากไม่พบหน้าจอก็จะส่งกลับ 0

  GraphicsDevice devices[];

  devices = GraphicsEnvironment.
     getLocalGraphicsEnvironment().
     getScreenDevices();

  return Stream.
     of(devices).
     map(GraphicsDevice::getDefaultConfiguration).
     map(GraphicsConfiguration::getBounds).
     mapToInt(bounds -> bounds.x + bounds.width).
     max().
     orElse(0);

นี่คือลิงค์ไปยัง JavaDoc

GraphicsEnvironment.getLocalGraphicsEnvironment ()
GraphicsEnvironment.getScreenDevices ()
GraphicsDevice.getDefaultConfiguration ()
GraphicsConfiguration.getBounds ()


2

ฟังก์ชั่นทั้งสามนี้คืนขนาดหน้าจอใน Java รหัสนี้บัญชีสำหรับการตั้งค่าหลายจอภาพและแถบงาน ฟังก์ชั่นรวมเป็น: getScreenInsets () , getScreenWorkingArea ()และgetScreenTotalArea ()

รหัส:

/**
 * getScreenInsets, This returns the insets of the screen, which are defined by any task bars
 * that have been set up by the user. This function accounts for multi-monitor setups. If a
 * window is supplied, then the the monitor that contains the window will be used. If a window
 * is not supplied, then the primary monitor will be used.
 */
static public Insets getScreenInsets(Window windowOrNull) {
    Insets insets;
    if (windowOrNull == null) {
        insets = Toolkit.getDefaultToolkit().getScreenInsets(GraphicsEnvironment
                .getLocalGraphicsEnvironment().getDefaultScreenDevice()
                .getDefaultConfiguration());
    } else {
        insets = windowOrNull.getToolkit().getScreenInsets(
                windowOrNull.getGraphicsConfiguration());
    }
    return insets;
}

/**
 * getScreenWorkingArea, This returns the working area of the screen. (The working area excludes
 * any task bars.) This function accounts for multi-monitor setups. If a window is supplied,
 * then the the monitor that contains the window will be used. If a window is not supplied, then
 * the primary monitor will be used.
 */
static public Rectangle getScreenWorkingArea(Window windowOrNull) {
    Insets insets;
    Rectangle bounds;
    if (windowOrNull == null) {
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        insets = Toolkit.getDefaultToolkit().getScreenInsets(ge.getDefaultScreenDevice()
                .getDefaultConfiguration());
        bounds = ge.getDefaultScreenDevice().getDefaultConfiguration().getBounds();
    } else {
        GraphicsConfiguration gc = windowOrNull.getGraphicsConfiguration();
        insets = windowOrNull.getToolkit().getScreenInsets(gc);
        bounds = gc.getBounds();
    }
    bounds.x += insets.left;
    bounds.y += insets.top;
    bounds.width -= (insets.left + insets.right);
    bounds.height -= (insets.top + insets.bottom);
    return bounds;
}

/**
 * getScreenTotalArea, This returns the total area of the screen. (The total area includes any
 * task bars.) This function accounts for multi-monitor setups. If a window is supplied, then
 * the the monitor that contains the window will be used. If a window is not supplied, then the
 * primary monitor will be used.
 */
static public Rectangle getScreenTotalArea(Window windowOrNull) {
    Rectangle bounds;
    if (windowOrNull == null) {
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        bounds = ge.getDefaultScreenDevice().getDefaultConfiguration().getBounds();
    } else {
        GraphicsConfiguration gc = windowOrNull.getGraphicsConfiguration();
        bounds = gc.getBounds();
    }
    return bounds;
}


1
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
double width = screenSize.getWidth();
double height = screenSize.getHeight();
framemain.setSize((int)width,(int)height);
framemain.setResizable(true);
framemain.setExtendedState(JFrame.MAXIMIZED_BOTH);

1

นี่คือตัวอย่างของรหัสที่ฉันมักใช้ มันคืนพื้นที่หน้าจอที่มีให้เต็ม (แม้ในการตั้งค่าจอภาพหลายจอ) ในขณะที่ยังคงตำแหน่งจอภาพดั้งเดิมอยู่

public static Rectangle getMaximumScreenBounds() {
    int minx=0, miny=0, maxx=0, maxy=0;
    GraphicsEnvironment environment = GraphicsEnvironment.getLocalGraphicsEnvironment();
    for(GraphicsDevice device : environment.getScreenDevices()){
        Rectangle bounds = device.getDefaultConfiguration().getBounds();
        minx = Math.min(minx, bounds.x);
        miny = Math.min(miny, bounds.y);
        maxx = Math.max(maxx,  bounds.x+bounds.width);
        maxy = Math.max(maxy, bounds.y+bounds.height);
    }
    return new Rectangle(minx, miny, maxx-minx, maxy-miny);
}

บนคอมพิวเตอร์ที่มีจอภาพ Full-HD สองจอโดยที่จอภาพด้านซ้ายตั้งเป็นจอภาพหลัก (ในการตั้งค่า Windows) ฟังก์ชันจะส่งคืน

java.awt.Rectangle[x=0,y=0,width=3840,height=1080]

ในการตั้งค่าเดียวกัน แต่ด้วยการตั้งค่าจอภาพที่ถูกต้องเป็นจอภาพหลักฟังก์ชั่นจะกลับมา

java.awt.Rectangle[x=-1920,y=0,width=3840,height=1080]

0
int screenResolution = Toolkit.getDefaultToolkit().getScreenResolution();
System.out.println(""+screenResolution);

ยินดีต้อนรับสู่ Stack Overflow! ในขณะที่ข้อมูลโค้ดนี้อาจแก้ไขคำถามรวมถึงคำอธิบายช่วยปรับปรุงคุณภาพของโพสต์ของคุณ จำไว้ว่าคุณกำลังตอบคำถามสำหรับผู้อ่านในอนาคตและคนเหล่านั้นอาจไม่ทราบสาเหตุของการแนะนำรหัสของคุณ โปรดอย่าพยายามทำให้รหัสของคุณแน่นเกินไปด้วยคำอธิบายที่อธิบายซึ่งจะช่วยลดความสามารถในการอ่านของทั้งรหัสและคำอธิบาย!
kayess
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.