Показать JFrame на определенном экране в конфигурации с двумя мониторами
У меня есть конфигурация с двумя мониторами, и я хочу запустить свой графический интерфейс на определенном мониторе, если он найден. Я попытался создать окно JFrame
, передающее объект GraphicConfiguration
моего экранного устройства, но он не работает, кадр все еще отображается на главном экране.
Как настроить экран, на котором должен отображаться мой кадр?
Ответы
Ответ 1
public static void showOnScreen( int screen, JFrame frame )
{
GraphicsEnvironment ge = GraphicsEnvironment
.getLocalGraphicsEnvironment();
GraphicsDevice[] gs = ge.getScreenDevices();
if( screen > -1 && screen < gs.length )
{
gs[screen].setFullScreenWindow( frame );
}
else if( gs.length > 0 )
{
gs[0].setFullScreenWindow( frame );
}
else
{
throw new RuntimeException( "No Screens Found" );
}
}
Ответ 2
Я модифицировал @Joseph-gordon ответ, чтобы обеспечить способ достижения этого без принудительного полноэкранного режима:
public static void showOnScreen( int screen, JFrame frame ) {
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] gd = ge.getScreenDevices();
if( screen > -1 && screen < gd.length ) {
frame.setLocation(gd[screen].getDefaultConfiguration().getBounds().x, frame.getY());
} else if( gd.length > 0 ) {
frame.setLocation(gd[0].getDefaultConfiguration().getBounds().x, frame.getY());
} else {
throw new RuntimeException( "No Screens Found" );
}
}
В этом коде я предполагаю, что getDefaultConfiguration()
никогда не вернет null. Если это не так, тогда кто-то, пожалуйста, поправьте меня. Но этот код работает, чтобы переместить ваш JFrame
на нужный экран.
Ответ 3
Очень чистое решение после прочтения документов для JFrame.setLocationRelativeTo
Отображение на экране 2
public void moveToScreen() {
setVisible(false);
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] screens = ge.getScreenDevices();
int n = screens.length;
for (int i = 0; i < n; i++) {
if (screens[i].getIDstring().contentEquals(settings.getScreen())) {
JFrame dummy = new JFrame(screens[i].getDefaultConfiguration());
setLocationRelativeTo(dummy);
dummy.dispose();
}
}
setVisible(true);
}
Эта функция может использоваться для переключения окна приложения между экранами
Ответ 4
Обратитесь к GraphicsDevice API, у вас есть хороший пример.
Ответ 5
Мой опыт заключается в расширении настольных компьютеров на нескольких мониторах, а также в настройке мониторов как отдельных (X11) дисплеев. Если это не то, что вы хотите сделать, это не будет применяться.
И мое решение было немного взломанным: я вызвал Toolkit.getScreenSize()
, определил, был ли я в ситуации с несколькими мониторами (сравнивая высоту с шириной и предполагая, что ширинa > в два раза указана для нескольких мониторов) затем установите начальное положение X и Y кадра.
Ответ 6
С каждым, кто использует свои собственные ароматы, на основе других ароматов, добавляю мой, потому что остальные заблокировали вас в отношении позиционирования окна на выбранном экран.
Это просто лучший. Он также позволяет вам установить местоположение на другом экране.
public void setLocation( int screen, double x, double y ) {
GraphicsEnvironment g = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] d = g.getScreenDevices();
if ( screen >= d.length ) {
screen = d.length - 1;
}
Rectangle bounds = d[screen].getDefaultConfiguration().getBounds();
// Is double?
if ( x == Math.floor(x) && !Double.isInfinite(x) ) {
x *= bounds.x; // Decimal -> percentage
}
if ( y == Math.floor(y) && !Double.isInfinite(y) ) {
y *= bounds.y; // Decimal -> percentage
}
x = bounds.x + x;
y = jframe.getY() + y;
if ( x > bounds.x) x = bounds.x;
if ( y > bounds.y) y = bounds.y;
// If double we do want to floor the value either way
jframe.setLocation((int)x, (int)y);
}
Пример:
setLocation(2, 200, 200);
Даже позволяет пропустить процент для позиции экрана!
setLocation(2, 0.5, 0); // Place on right edge from the top down if combined with setSize(50%, 100%);
экран должен быть больше 0, что, я уверен, является жестким требованием!
Чтобы разместить последнее, просто вызовите с Integer.MAX_VALUE. **
Ответ 7
Для меня тоже неплохо работало (предположим, что левый монитор имеет размер 1920x1200):
A) установите на левом мониторе какое-то точное положение:
newFrame.setBounds(200,100,400,200)
B) установить на правый монитор в определенном месте:
newFrame.setBounds(2000,100,200,100)
C), установленный на увеличенном экране слева:
newFrame.setBounds(200,100,400,200)
newFrame.setExtendedState(JFrame.MAXIMIZED_BOTH)
D) установлен на правом мониторе максимально
newFrame.setBounds(2000,100,200,100)
newFrame.setExtendedState(JFrame.MAXIMIZED_BOTH)
Ответ 8
Многие из решений здесь работают для расширенных дисплеев. Если вы используете отдельные дисплеи, просто передайте объект конфигурации графики желаемого графического устройства в конструктор jframe или jdialog.
Ответ 9
Ответ Викиса содержит правильный указатель. Это новый JFrame (GraphicsConfiguration gc), который делает это.
Вы можете сделать это следующим образом:
GraphicsDevice otherScreen = getOtherScreen(this);
JFrame frameOnOtherScreen = new JFrame(otherScreen.getDefaultConfiguration());
private GraphicsDevice getOtherScreen(Component component) {
GraphicsEnvironment graphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment();
if (graphicsEnvironment.getScreenDevices().length == 1) {
// if there is only one screen, return that one
return graphicsEnvironment.getScreenDevices()[0];
}
GraphicsDevice theWrongOne = component.getGraphicsConfiguration().getDevice();
for (GraphicsDevice dev : graphicsEnvironment.getScreenDevices()) {
if (dev != theWrongOne) {
return dev;
}
}
return null;
}
Ответ 10
Если вы хотите установить его в центр левого экрана:
int halfScreen = (int)(screenSize.width/2);
frame.setLocation((halfScreen - frame.getSize().width)/2, (screenSize.height - frame.getSize().height)/2);
Если вы хотите установить его в центр правого экрана:
int halfScreen = (int)(screenSize.width/2);
frame.setLocation((halfScreen - frame.getSize().width)/2 + halfScreen, (screenSize.height - frame.getSize().height)/2);
Ответ 11
Я изменил @Joseph-gordon и @ryvantage ответ, чтобы обеспечить способ достижения этого, не форсируя полноэкранное фиксированное положение конфигурации экрана и не центрируя его на экране выбора:
public void showOnScreen(int screen, JFrame frame ) {
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] gd = ge.getScreenDevices();
int width = 0, height = 0;
if( screen > -1 && screen < gd.length ) {
width = gd[screen].getDefaultConfiguration().getBounds().width;
height = gd[screen].getDefaultConfiguration().getBounds().height;
frame.setLocation(
((width / 2) - (frame.getSize().width / 2)) + gd[screen].getDefaultConfiguration().getBounds().x,
((height / 2) - (frame.getSize().height / 2)) + gd[screen].getDefaultConfiguration().getBounds().y
);
frame.setVisible(true);
} else {
throw new RuntimeException( "No Screens Found" );
}
}
Ответ 12
основываясь на ответе @ryvantage, я улучшил его, чтобы оно отображалось в центре экрана:
private static void showOnScreen( int screen, Window frame ) {
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] gd = ge.getScreenDevices();
GraphicsDevice graphicsDevice;
if( screen > -1 && screen < gd.length ) {
graphicsDevice = gd[screen];
} else if( gd.length > 0 ) {
graphicsDevice = gd[0];
} else {
throw new RuntimeException( "No Screens Found" );
}
Rectangle bounds = graphicsDevice.getDefaultConfiguration().getBounds();
int screenWidth = graphicsDevice.getDisplayMode().getWidth();
int screenHeight = graphicsDevice.getDisplayMode().getHeight();
frame.setLocation(bounds.x + (screenWidth - frame.getPreferredSize().width) / 2,
bounds.y + (screenHeight - frame.getPreferredSize().height) / 2);
frame.setVisible(true);
}