Làm thế nào tôi có thể có được độ phân giải màn hình trong java?


136

Làm thế nào người ta có thể có được độ phân giải màn hình (chiều rộng x chiều cao) bằng pixel?

Tôi đang sử dụng một JFrame và các phương thức swing java.


2
bạn có thể cung cấp thêm một số chi tiết về những gì bạn thắc mắc. Một lớp lót có thể dẫn đến hàng trăm cách khác nhau.
Anil Vishnoi

7
Tôi đoán bạn không quan tâm đến nhiều thiết lập màn hình. Có vẻ như nhiều nhà phát triển ứng dụng bỏ qua những điều này. Mọi người đều sử dụng nhiều màn hình nơi tôi làm việc, vì vậy chúng tôi luôn phải suy nghĩ về chúng. Chúng tôi thăm dò tất cả các màn hình và thiết lập chúng dưới dạng các đối tượng màn hình để chúng tôi có thể nhắm mục tiêu chúng khi chúng mở ra các khung mới. Nếu bạn thực sự không cần chức năng này, thì tôi đoán rằng bạn đã hỏi một câu hỏi mở như vậy và chấp nhận câu trả lời nhanh như vậy.
Erick Robertson

Câu trả lời:


267

Bạn có thể có được kích thước màn hình với Toolkit.getScreenSize()phương pháp.

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

Trên cấu hình đa màn hình, bạn nên sử dụng:

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

Nếu bạn muốn có độ phân giải màn hình trong DPI, bạn sẽ phải sử dụng getScreenResolution()phương pháp trên Toolkit.


Tài nguyên :


4
Điều này không làm việc cho tôi. Tôi có màn hình 3840x2160, nhưng getScreenSizetrả về 1920x1080.
ZhekaKozlov

15

Mã này sẽ liệt kê các thiết bị đồ họa trên hệ thống (nếu nhiều màn hình được cài đặt) và bạn có thể sử dụng thông tin đó để xác định mối quan hệ của màn hình hoặc vị trí tự động (một số hệ thống sử dụng màn hình phụ nhỏ để hiển thị trong thời gian thực khi ứng dụng đang chạy nền và màn hình như vậy có thể được xác định theo kích thước, màu màn hình, v.v.):

// 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

Đây là độ phân giải của màn hình mà thành phần đã cho hiện được gán (một cái gì đó giống như hầu hết các phần của cửa sổ gốc được hiển thị trên màn hình đó).

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

Sử dụng:

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

Nếu bạn muốn tôn trọng các thanh công cụ, v.v. bạn cũng sẽ cần tính toán với điều này:

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

3

Đây là một số mã chức năng (Java 8) trả về vị trí x của cạnh phải nhất của màn hình bên phải nhất. Nếu không tìm thấy màn hình thì nó trả về 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);

Dưới đây là các liên kết đến JavaDoc.

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


2

Ba hàm này trả về kích thước màn hình trong Java. Mã này chiếm các thiết lập đa màn hình và thanh tác vụ. Các hàm bao gồm: getScreenInsets () , getScreenWorkingArea ()getScreenTotalArea () .

Mã số:

/**
 * 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
int resolution =Toolkit.getDefaultToolkit().getScreenResolution();

System.out.println(resolution);

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

Đây là một đoạn mã tôi thường sử dụng. Nó trả về toàn bộ diện tích màn hình có sẵn (ngay cả trên các thiết lập đa màn hình) trong khi vẫn giữ các vị trí màn hình gốc.

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

Trên máy tính có hai màn hình full-HD, trong đó màn hình bên trái được đặt làm màn hình chính (trong cài đặt Windows), chức năng sẽ trả về

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

Trên cùng một thiết lập, nhưng với màn hình bên phải được đặt làm màn hình chính, chức năng sẽ trả về

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

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

Chào mừng bạn đến với Stack Overflow! Mặc dù đoạn mã này có thể giải quyết câu hỏi, bao gồm một lời giải thích thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn. Xin vui lòng cố gắng không làm đông mã của bạn với các bình luận giải thích, điều này làm giảm khả năng đọc của cả mã và các giải thích!
chèo thuyền kayak
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.