How can I get screen resolution in java?

JavaSwingScreenResolution

Java Problem Overview


How can one get the screen resolution (width x height) in pixels?

I am using a JFrame and the java swing methods.

Java Solutions


Solution 1 - Java

You can get the screen size with the Toolkit.getScreenSize() method.

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

On a multi-monitor configuration you should use this :

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

If you want to get the screen resolution in DPI you'll have to use the getScreenResolution() method on Toolkit.


Resources :

Solution 2 - Java

This code will enumerate the graphics devices on the system (if multiple monitors are installed), and you can use that information to determine monitor affinity or automatic placement (some systems use a little side monitor for real-time displays while an app is running in the background, and such a monitor can be identified by size, screen colors, etc.):

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

Solution 3 - Java

This call will give you the information you want.

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

Solution 4 - Java

Here's some functional code (Java 8) which returns the x position of the right most edge of the right most screen. If no screens are found, then it returns 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);

Here are links to the JavaDoc.

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

Solution 5 - Java

This is the resolution of the screen that the given component is currently assigned (something like most part of the root window is visible on that screen).

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

Usage:

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

If you want to respect toolbars, etc. you'll need to calculate with this, too:

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

Solution 6 - Java

These three functions return the screen size in Java. This code accounts for multi-monitor setups and task bars. The included functions are: getScreenInsets(), getScreenWorkingArea(), and getScreenTotalArea().

Code:

/**
 * 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;
}

Solution 7 - Java

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

Solution 8 - Java

Here is a snippet of code I often use. It returns the full available screen area (even on multi-monitor setups) while retaining the native monitor positions.

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

On a computer with two full-HD monitors, where the left one is set as the main monitor (in Windows settings), the function returns

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

On the same setup, but with the right monitor set as the main monitor, the function returns

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

Solution 9 - Java

int resolution =Toolkit.getDefaultToolkit().getScreenResolution();

System.out.println(resolution);

Solution 10 - Java

There's many answers but I still feel they're not adequate enough, my approach computes global variables related to the screen size once and also using a single loop of all the monitors:

public final class ScreenArea {
	public static final Rectangle RECTANGLE;
	public static final int 
		LEFT, RIGHT, 
		TOP, BOTTOM, 
		MIN_WIDTH, MAX_WIDTH, 
		MIN_HEIGHT, MAX_HEIGHT, 
		TOTAL_WIDTH, TOTAL_HEIGHT;
	
	static {
		// Initialise local vars
		int left, right, top, bottom, minWidth, maxWidth, minHeight, maxHeight;
		left = top = minWidth = minHeight = Integer.MAX_VALUE;
		right = bottom = maxWidth = maxHeight = Integer.MIN_VALUE;
		// In a single loop process all bounds
		Rectangle bounds;
		for (GraphicsDevice device : GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()) {
			bounds = device.getDefaultConfiguration().getBounds();
			if (left > bounds.x)
				left = bounds.x;
			if (right < bounds.x + bounds.width)
				right = bounds.x + bounds.width;
			if (top > bounds.y)
				top = bounds.y;
			if (bottom < bounds.y + bounds.height)
				bottom = bounds.y + bounds.height;
			if (minWidth > bounds.width)
				minWidth = bounds.width;
			if (maxWidth < bounds.width)
				maxWidth = bounds.width;
			if (minHeight > bounds.height)
				minHeight = bounds.height;
			if (maxHeight < bounds.height)
				maxHeight = bounds.height;
		}
		TOTAL_WIDTH = right - left;
		TOTAL_HEIGHT = bottom - top;
		RECTANGLE = new Rectangle(TOTAL_WIDTH, TOTAL_HEIGHT);
		// Transfer local to immutable global vars
		LEFT = left; RIGHT = right; TOP = top; BOTTOM = bottom;
		MIN_WIDTH = minWidth; MAX_WIDTH = maxWidth;
		MIN_HEIGHT = minHeight; MAX_HEIGHT = maxHeight;
	}
}

Then you can use anytime as is just like this :

System.out.printf("LEFT=%d, ", ScreenArea.LEFT);
System.out.printf("RIGHT=%d%n", ScreenArea.RIGHT);
System.out.printf("TOP=%d, ", ScreenArea.TOP);
System.out.printf("BOTTOM=%d%n", ScreenArea.BOTTOM);
System.out.printf("MIN_WIDTH=%d, ", ScreenArea.MIN_WIDTH);
System.out.printf("MAX_WIDTH=%d%n", ScreenArea.MAX_WIDTH);
System.out.printf("MIN_HEIGHT=%d, ", ScreenArea.MIN_HEIGHT);
System.out.printf("MAX_HEIGHT=%d%n", ScreenArea.MAX_HEIGHT);
System.out.printf("SCREEN_AREA=%s%n", ScreenArea.RECTANGLE);

Which on my dual monitor setup it prints :

LEFT=0, RIGHT=3840
TOP=0, BOTTOM=1080
MIN_WIDTH=1920, MAX_WIDTH=1920
MIN_HEIGHT=1080, MAX_HEIGHT=1080
SCREEN_AREA=java.awt.Rectangle[x=0,y=0,width=3840,height=1080]

Solution 11 - Java

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

Solution 12 - Java

Unfortunately Toolkit.getDefaultToolkit() does not help if you have multiple displays, and on Windows it also reports scaled values if you have changed font setting "Scale and Layout" from 100%. For example at 150% font scale my 1920x1080 screen is reported as 1280x720 which (unhelpfully) changes the resolution my app uses.

Instead I use this method which reads the default display modes of each GraphicsDevice to access the original screen position+dimensions, and returns set of rectangles sorted in left->right X position order per screen:

/** Get actual screen display sizes, ignores Windows font scaling, sort left to right */
public static List<Rectangle> getDisplays() {
  return Arrays.stream(GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices())
     .map(GraphicsDevice::getDefaultConfiguration)
     // For scaled sizes use .map(GraphicsConfiguration::getBounds) instead of:
     .map(c -> {
			var dm = c.getDevice().getDisplayMode();
			var bounds = c.getBounds();
			return new Rectangle((int)bounds.getX(), (int)bounds.getY(), dm.getWidth(), dm.getHeight());
	  })
     .sorted(Comparator.comparing(Rectangle::getX))
     .toList();
}

The above code runs under Windows and WSL.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAndreDuraoView Question on Stackoverflow
Solution 1 - JavaColin HebertView Answer on Stackoverflow
Solution 2 - JavaRick HodginView Answer on Stackoverflow
Solution 3 - JavaStarkeyView Answer on Stackoverflow
Solution 4 - JavaNathanView Answer on Stackoverflow
Solution 5 - JavajanView Answer on Stackoverflow
Solution 6 - JavaBlakeTNCView Answer on Stackoverflow
Solution 7 - JavaAjeeth KumarView Answer on Stackoverflow
Solution 8 - JavaMyrkaView Answer on Stackoverflow
Solution 9 - JavaEric WarrinerView Answer on Stackoverflow
Solution 10 - JavaLorenzoView Answer on Stackoverflow
Solution 11 - Javachamindu ilshanView Answer on Stackoverflow
Solution 12 - JavaDuncGView Answer on Stackoverflow