자바 화면 해상도를 얻으려면 어떻게 해야 하나요?
픽셀 단위의 화면 해상도(폭×높이)는 어떻게 얻을 수 있습니까?
JFrame과 Java swing 방식을 사용하고 있습니다.
화면 사이즈를 취득하려면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
.
자원:
- javadoc - Toolkit.getScreenSize()
- Java bug 5100801-Toolkit.getScreenSize()가 멀티온 Linux에서 올바른 치수를 반환하지 않음
이 코드는 시스템상의 그래픽 디바이스를 열거합니다(복수의 모니터가 설치되어 있는 경우).이 정보를 사용하여 모니터의 어피니티 또는 자동 배치를 판단할 수 있습니다(어플리케이션이 백그라운드에서 실행되고 있는 동안 일부 시스템은 실시간 디스플레이에 작은 사이드 모니터를 사용합니다.이러한 모니터는 크기, 화면 색상으로 식별할 수 있습니다.기타:
// 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
}
이 전화를 통해 원하는 정보를 얻을 수 있습니다.
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
여기 기능 코드(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()
Graphics Configuration.getBounds()
이것은 특정 컴포넌트가 현재 할당되어 있는 화면의 해상도입니다(루트 창의 대부분과 같은 부분이 화면에 표시됩니다).
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);
이 세 가지 함수는 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;
}
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);
여기 제가 자주 사용하는 코드 조각이 있습니다.기본 모니터 위치를 유지하면서 사용 가능한 전체 화면 영역(멀티 모니터 설정에서도)을 반환합니다.
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);
}
두 대의 풀HD 모니터가 있는 컴퓨터에서는 왼쪽 모니터가 메인 모니터로 설정되어 있으면 함수가 반환됩니다(Windows 설정).
java.awt.Rectangle[x=0,y=0,width=3840,height=1080]
같은 설정이지만 오른쪽 모니터를 메인 모니터로 설정하면 함수가 반환됩니다.
java.awt.Rectangle[x=-1920,y=0,width=3840,height=1080]
int resolution =Toolkit.getDefaultToolkit().getScreenResolution();
System.out.println(resolution);
답은 많지만 아직 충분하다고는 생각하지 않습니다.저의 접근방식은 화면 크기와 관련된 글로벌 변수를 한 번 계산하고 모든 모니터의 단일 루프를 사용합니다.
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;
}
}
그러면 다음과 같이 언제든지 사용할 수 있습니다.
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);
듀얼 모니터 설정에서는, 다음과 같이 인쇄됩니다.
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]
int screenResolution = Toolkit.getDefaultToolkit().getScreenResolution();
System.out.println(""+screenResolution);
도 ★★★★★★★★★★★★★★★.Toolkit.getDefaultToolkit()
는, 복수의 디스플레이가 있는 경우는 도움이 되지 않습니다.또, Windows 에서는, 글꼴 설정의 「스케일과 레이아웃」을 100% 로부터 변경했을 경우, 스케일 된 값이 보고됩니다.예를 들어, 150% 폰트의 경우 1920x1080 화면은 1280x720으로 표시되며, 이로 인해 앱이 사용하는 해상도가 (도움이 되지 않습니다) 변경됩니다.
이 하여 각 .GraphicsDevice
원래 화면 위치 + 치수에 액세스하여 화면당 왼쪽→오른쪽 X 위치 순서로 정렬된 직사각형 세트를 반환합니다.
/** 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();
}
위의 코드는 Windows 및 WSL에서 실행됩니다.
언급URL : https://stackoverflow.com/questions/3680221/how-can-i-get-screen-resolution-in-java
'IT이야기' 카테고리의 다른 글
Joda Time 라이브러리를 사용하여 날짜 문자열을 DateTime 개체로 변환 (0) | 2022.07.03 |
---|---|
새로운 소재 테마에서 백 화살표의 색상을 변경하는 방법은 무엇입니까? (0) | 2022.07.03 |
타이프 스크립트에 필요한 매개 변수(선택 사항) (0) | 2022.07.03 |
내부 람다에서 로컬 변수 수정 (0) | 2022.07.02 |
Java에서 inner 클래스와 static nested 클래스의 주요 차이점은 무엇입니까? (0) | 2022.07.02 |