JFrame / Screen auf zweitem (definiertem) Monitor öffnen

internet

Top Contributor
Hallo,

gibt es eine Möglichkeit, die folgendes kann:
  • Ich starte eine Java Anwendung
  • Nachdem diese hochgefahren ist, öffnet es mein Hauptfenster
- Anschließend möchte ich ein zweites Fenster öffnen, das aber auf einem bestimmten Monitor geöffnet wird.

Folgendes stelle ich mir vor:
  • Liste von allen Monitoren bekommen
  • Auswählen auf welchem Monitor das Fenster geöffnet wird? (= eine UniqueID)?
  • Diese UniqueID speichern, sodass die Info bei einem Neustart der Anwendung nicht verloren geht

Nun starte ich die App und eine Methode wird ausgeführt:
  • Alle Monitore holen und Abgleich mit der Monitor UniqueID
  • Wenn diese gefunden wurde, dann öffne mir ein Fenster auf diesem Monitor

Hat hier jemand eine Idee?
Vielleicht so? (habe gerade kein Zugriff meine IDE, aber das könnte vllt. gehen)
 
Hallo,

ich hab mal ein kleines Beispiel zusammen gebaut. Ich hoff du kannst damit was anfangen

Java:
import java.awt.BorderLayout;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.HeadlessException;
import java.util.Optional;
import java.util.prefs.Preferences;
import java.util.stream.Stream;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

public class ScreenSelector {

    public static void main(String[] args) {
        var savedScreen = getSavedScreen();

        if (savedScreen.isEmpty()) {
            showScreenSelector();
        } else {
            openMainFrame(savedScreen.get());
        }
    }

    private static void showScreenSelector() throws HeadlessException {
        var frame = new JFrame("Screen Selector");

        var screens = GraphicsEnvironment.getLocalGraphicsEnvironment()
                .getScreenDevices();

        var screenList = new JList<GraphicsDevice>(screens);
        var openNewFrame = new JButton("Open new Frame");
        openNewFrame.setEnabled(false);

        openNewFrame.addActionListener(e -> {
            var screen = screenList.getSelectedValue();
            saveScreen(screen);
            openMainFrame(screen);

            frame.setVisible(false);
        });

        screenList.addListSelectionListener(e -> openNewFrame.setEnabled(true));

        frame.add(new JScrollPane(screenList));
        frame.add(openNewFrame, BorderLayout.SOUTH);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();

        SwingUtilities.invokeLater(() -> frame.setVisible(true));
    }

    private static void openMainFrame(GraphicsDevice screen) {
        var newFrame = new JFrame("Main Frame", screen.getDefaultConfiguration());
        newFrame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        newFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        SwingUtilities.invokeLater(() -> newFrame.setVisible(true));
    }

    private static void saveScreen(GraphicsDevice screen) {
        Preferences.userNodeForPackage(ScreenSelector.class)
                .put("screen", screen.getIDstring());
    }

    private static Optional<GraphicsDevice> getSavedScreen() {
        var screenId = Preferences.userNodeForPackage(ScreenSelector.class)
                .get("screen", null);

        var screens = GraphicsEnvironment.getLocalGraphicsEnvironment()
                .getScreenDevices();

        return Stream.of(screens)
                .filter(screen -> screen.getIDstring().equals(screenId))
                .findFirst();
    }
}
 
danke für den Beispielcode.
Ich habe ihm mal compiliert. Leider erscheint bei mir aber kein Output, also es wird auch kein Fenster angezeigt?

- Ich verwende Mac OS, Habe es mit JDK 11.0.15 laufen lassen.
Zusätzlich die Frage, kann ich auch den Namen der Bildschirme mir irgendwie anzeigen lassen? Aktuell habe ich nur eine DevideId gesehen (die ich auch benötige), aber ein Bildschirm wäre super. Oder noch besser die Anordnung der Bildschirme?
 
danke für den Beispielcode.
Ich habe ihm mal compiliert. Leider erscheint bei mir aber kein Output, also es wird auch kein Fenster angezeigt?

- Ich verwende Mac OS, Habe es mit JDK 11.0.15 laufen lassen.
Zusätzlich die Frage, kann ich auch den Namen der Bildschirme mir irgendwie anzeigen lassen? Aktuell habe ich nur eine DevideId gesehen (die ich auch benötige), aber ein Bildschirm wäre super. Oder noch besser die Anordnung der Bildschirme?
Also auf meinem Mac lief der Code ohne jede Änderung.

Die Namen kannst Du zumindest aus den auf Anhieb ersichtlichen Daten nicht finden, aber Du kannst die Anordnung feststellen. Es ist ja alles sozusagen ein großer virtueller Bildschirm und jeder physikalische Bildschirm hat einen Ausschnitt.

Vom Screen kannst Du Dir die Daten holen per getDefaultConfiguration.getBounds(), was die dann das Rectangle gibt mit Position (x,y) und Größe (width/height)
 

Zurück
Oben