Zeigen Sie JFrame in einem bestimmten Bildschirm in einer Dual-Monitor-Konfiguration an

Lesezeit: 4 Minuten

Zeigen Sie JFrame in einem bestimmten Bildschirm in einer Dual Monitor Konfiguration
Schlag

Ich habe eine Dual-Monitor-Konfiguration und möchte meine GUI auf einem bestimmten Monitor ausführen, wenn sie gefunden wird. Ich habe versucht, meine zu erstellen JFrame Fenster vorbei a GraphicConfiguration Objekt meines Bildschirmgeräts, aber es funktioniert nicht, der Rahmen wird immer noch auf dem Hauptbildschirm angezeigt.

Wie kann ich den Bildschirm einstellen, auf dem mein Rahmen angezeigt werden soll?

Zeigen Sie JFrame in einem bestimmten Bildschirm in einer Dual Monitor Konfiguration
Josef Gordon

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

  • Aber warum bezieht sich das auf “Vollbild”? Was ist, wenn ich den Vollbildmodus nicht benötige?

    – Dimmt

    21. Februar 13 um 21:35 Uhr

  • @Dims, ich habe eine neue Antwort gegeben, die keinen Vollbildmodus erzwingt.

    – Ryvantage

    1. August 13 um 0:02 Uhr

  • Dies hat bei mir bei einem vertikalen Dual-Monitor-Setup nicht funktioniert. Obwohl beide in GraphicsDevices erkannt werden, wird der Rahmen immer auf dem Hauptmonitor angezeigt.

    – Mahm00d

    8. April 21 um 8:40 Uhr

Ich habe die Antwort von @ Joseph-gordon geändert, um dies zu erreichen, ohne den Vollbildmodus zu erzwingen:

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

In diesem Code gehe ich davon aus getDefaultConfiguration() wird niemals null zurückgeben. Wenn das nicht der Fall ist, korrigiert mich bitte jemand. Aber dieser Code funktioniert, um Ihre zu verschieben JFrame zum gewünschten Bildschirm.

  • Diese Lösung funktioniert nur, wenn die Geräte nicht vertikal ausgerichtet sind. Ersetzen frame.getY() mit gd[0].getDefaultConfiguration().getBounds().y + frame.getY() um dieses Problem zu beheben.

    – Ercksen

    8. Oktober 15 um 14:17 Uhr

  • Diese Lösung (auch mit dem Kommentar von @Ercksen ) funktioniert gut, aber das Fenster ist leicht außermittig. Um diesen Anruf zu reparieren frame.setExtendedState(frame.getExtendedState() | JFrame.MAXIMIZED_BOTH); am Ende oder nach dem showOnScreen(SCREEN_ID, frame) Anruf

    – Shan

    17. April 18 um 9:17 Uhr


1643101626 519 Zeigen Sie JFrame in einem bestimmten Bildschirm in einer Dual Monitor Konfiguration
Vicky Ronnen

Eine viel sauberere Lösung nach dem Lesen der Dokumentation für JFrame.setLocationRelativeTo Display auf Bildschirm 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);
}

Diese Funktion kann verwendet werden, um das Anwendungsfenster zwischen Bildschirmen umzuschalten

  • Was genau sind Einstellungen?

    – Machado

    13. April 17 um 14:26 Uhr

  • Es ist wahrscheinlich die Ausgabe eines Einstellungsparsers, der ein String-Feld namens screen hat.

    – rhbvkleef

    26. Januar 19 um 14:39 Uhr

Zeigen Sie JFrame in einem bestimmten Bildschirm in einer Dual Monitor Konfiguration
Gerardo Cignarella Godoy

Ich habe die Antwort von @Joseph-gordon und @ryvantage geändert, um dies zu erreichen, ohne den Vollbildmodus mit fester Bildschirmkonfiguration zu erzwingen und ihn auf dem ausgewählten Bildschirm zu zentrieren:

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

Bitte beziehen Sie sich auf GraphicsDevice API, da haben Sie ein gutes Beispiel.

Wenn sich jeder mit seinem einbringt eigene Aromen, basierend auf anderen Aromen, Ich füge meine hinzu weil die anderen Sie in Bezug auf die Positionierung des Fensters auf dem ausgewählten Bildschirm eingesperrt haben.

Es ist einfach das Beste. Sie können den Standort auch auf dem anderen Bildschirm festlegen.

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

Beispiel:

setLocation(2, 200, 200);

Sie können sogar einen Prozentsatz für die Bildschirmposition übergeben!

setLocation(2, 0.5, 0);     // Place on right edge from the top down if combined with setSize(50%, 100%);

screen muss größer als 0 sein, was meiner Meinung nach eine harte Anforderung ist!

Um an letzter Stelle zu setzen, rufen Sie einfach mit an Ganzzahl.MAX_VALUE.

1643101627 186 Zeigen Sie JFrame in einem bestimmten Bildschirm in einer Dual Monitor Konfiguration
Anonym

Meine Erfahrung besteht darin, Desktops auf mehrere Monitore zu erweitern, anstatt die Monitore als separate (X11)-Displays zu konfigurieren. Wenn Sie dies nicht möchten, gilt dies nicht.

Und meine Lösung war ein kleiner Hack: Ich rief an Toolkit.getScreenSize(), bestimmt, ob ich mich in einer Multi-Monitor-Situation befinde (indem ich die Höhe mit der Breite vergleiche und annehme, dass Breite > doppelte Höhe Multi-Monitor anzeigt), und dann die anfängliche X- und Y-Position des Frames festlegt.

  • Vielen Dank für den Rat. Ich habe mit jframe.setBounds (graphicConfiguration.getBounds()) gelöst

    – Schlag

    7. Januar 11 um 16:24 Uhr

.

630170cookie-checkZeigen Sie JFrame in einem bestimmten Bildschirm in einer Dual-Monitor-Konfiguration an

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy