Подтвердить что ты не робот

Показать JFrame на определенном экране в конфигурации с двумя мониторами

У меня есть конфигурация с двумя мониторами, и я хочу запустить свой графический интерфейс на определенном мониторе, если он найден. Я попытался создать окно JFrame, передающее объект GraphicConfiguration моего экранного устройства, но он не работает, кадр все еще отображается на главном экране.

Как настроить экран, на котором должен отображаться мой кадр?

4b9b3361

Ответ 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);
}