2012-08-28 9 views
7

gezeigt ich eine wirklich große Anwendung, die mehrere Dialoge hat. Meine Aufgabe ist es, sicherzustellen, dass ein Dialog, der nicht vollständig sichtbar ist (weil der Benutzer ihn aus dem sichtbaren Bildschirmbereich herausgezogen hat) zurück in die Mitte des Bildschirms bewegt wird.Wie auf dem ein JDialog screenen, um herauszufinden, ist

das kein Problem ist, wenn ich mit einem Bildschirm nur zu tun bin. Es funktioniert gut ... aber die meisten Benutzer dieser Anwendung haben zwei Bildschirme auf dem Desktop ...

Wenn ich versuche herauszufinden, auf welchem ​​Bildschirm der Dialog angezeigt wird und es auf diesem bestimmten Bildschirm zu zentrieren,. .. Nun, es ist tatsächlich zentriert, aber auf dem primären Bildschirm (der möglicherweise nicht auf dem Bildschirm angezeigt wird).

Um Ihnen zu zeigen, was meine Gedanken waren so weit, hier ist der Code ...

/** 
* Get the number of the screen the dialog is shown on ... 
*/ 
private static int getActiveScreen(JDialog jd) { 
    int screenId = 1; 
    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
    GraphicsDevice[] gd = ge.getScreenDevices(); 
    for (int i = 0; i < gd.length; i++) { 
     GraphicsConfiguration gc = gd[i].getDefaultConfiguration(); 
     Rectangle r = gc.getBounds(); 
     if (r.contains(jd.getLocation())) { 
      screenId = i + 1; 
     } 
    } 
    return screenId; 
} 

/** 
* Get the Dimension of the screen with the given id ... 
*/ 
private static Dimension getScreenDimension(int screenId) { 
    Dimension d = new Dimension(0, 0); 
    if (screenId > 0) { 
     GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
     DisplayMode mode = ge.getScreenDevices()[screenId - 1].getDisplayMode(); 
     d.setSize(mode.getWidth(), mode.getHeight()); 
    } 
    return d; 
} 

/** 
* Check, if Dialog can be displayed completely ... 
* @return true, if dialog can be displayed completely 
*/ 
private boolean pruefeDialogImSichtbarenBereich() { 
    int screenId = getActiveScreen(this); 
    Dimension dimOfScreen = getScreenDimension(screenId); 
    int xPos = this.getX(); 
    int yPos = this.getY(); 
    Dimension dimOfDialog = this.getSize(); 
    if (xPos + dimOfDialog.getWidth() > dimOfScreen.getWidth() || yPos + dimOfDialog.getHeight() > dimOfScreen.getHeight()) { 
     return false; 
    } 
    return true; 
} 

/** 
* Center Dialog... 
*/ 
private void zentriereDialogAufMonitor() { 
    this.setLocationRelativeTo(null); 
} 

Während ich von Debug-Art über die Tatsache kam, dass getActiveScreen() nicht die Art, wie ich scheint allerdings zu arbeiten; es scheint immer 2 zurück zu geben (was eine Art Mist ist, da es bedeuten würde, dass der Dialog immer im zweiten Monitor angezeigt wird ... was natürlich nicht die Wahrheit ist).

Jeder bekam eine Ahnung, wie mein Dialog auf dem Bildschirm zu zentrieren es auf tatsächlich gezeigt wird?

+0

Wie viele Bildschirme werden auf mehreren Displays angezeigt? –

+0

Ich bin mir nicht ganz sicher, ob ich deine Frage bekomme, aber wenn ich es richtig verstanden habe, ... ich weiß es nicht. Es spielt keine Rolle, denn die Position der Dialoge wird gespeichert und überprüft, sobald der Dialog sichtbar wird ... beantwortet das Ihre Frage? :-) – gilaras

+0

Warum gibst du keinen Ort auf dem Bildschirm für den Dialog an? –

Antwort

1

Ihre getActiveScreen Methode funktioniert hat, außer es den Bildschirm mit der linken oberen Ecke des Fensters verwendet. Wenn Sie stattdessen Component.getGraphicsConfiguration() verwenden, erhalten Sie den Bildschirm mit den meisten Pixeln des Fensters. setLocationRelativeTo(null) ist hier keine Hilfe, weil es immer den primären Bildschirm verwendet. Hier ist, wie es zu lösen:

static boolean windowFitsOnScreen(Window w) { 
    return w.getGraphicsConfiguration().getBounds().contains(w.getBounds()); 
} 

static void centerWindowToScreen(Window w) { 
    Rectangle screen = w.getGraphicsConfiguration().getBounds(); 
    w.setLocation(
     screen.x + (screen.width - w.getWidth())/2, 
     screen.y + (screen.height - w.getHeight())/2 
    ); 
} 

Dann können Sie tun:

JDialog jd; 
... 
if (!windowFitsOnScreen(jd)) centerWindowToScreen(jd); 

, die den Dialog zum nächsten Bildschirm zentriert wird (Monitor). Möglicherweise müssen Sie sicherstellen, dass der Dialog zuerst angezeigt/positioniert wurde.

+0

Danke für deine Antwort :-) Es funktioniert nicht 100% so wie ich es ursprünglich wollte, aber das Verhalten ist jetzt ganz okay :-) Vielen Dank! :-) – gilaras

0

Hier ist der Code verwendet Stelle des Fensters zu zentrieren.

//Center the window 
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
    Dimension frameSize = frame.getSize(); 
    if (frameSize.height > screenSize.height) { 
    frameSize.height = screenSize.height; 
    } 
    if (frameSize.width > screenSize.width) { 
    frameSize.width = screenSize.width; 
    } 
    frame.setLocation((screenSize.width - frameSize.width)/2, (screenSize.height - frameSize.height)/2); 

mit der frame Sie den Dialog auch verwenden können.

+2

Dies beantwortet die Frage nicht. Es sagt nur, wie man es in einer Einzelbildschirm-Umgebung (die OP sagte, ist bereits für ihn arbeiten) ... – brimborium

+0

das ist wahr ...:-) – gilaras

1

Ich bin nicht sicher, wie viel davon von Nutzen sein wird, aber das ist der Code, den ich benutze, wenn grafische Geräte für Fenster, um zu bestimmen versuchen.

Ich schummle ein wenig, ich neige dazu, Component zu verwenden und den Hilfsmethoden zu erlauben, entweder das oberste Fenster zu finden oder den Component Bildschirmpunkt zu verwenden.

/** 
* Returns the GraphicsDevice that the specified component appears the most on. 
*/ 
public static GraphicsDevice getGraphicsDevice(Component comp) { 

    GraphicsDevice device = null; 

    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
    GraphicsDevice lstGDs[] = ge.getScreenDevices(); 

    ArrayList<GraphicsDevice> lstDevices = new ArrayList<GraphicsDevice>(lstGDs.length); 
    if (comp != null && comp.isVisible()) { 
     Rectangle parentBounds = comp.getBounds(); 

     /* 
     * If the component is not a window, we need to find its location on the 
     * screen... 
     */ 
     if (!(comp instanceof Window)) { 
      Point p = new Point(0, 0); 
      SwingUtilities.convertPointToScreen(p, comp); 
      parentBounds.setLocation(p); 
     } 

     for (GraphicsDevice gd : lstGDs) { 
      GraphicsConfiguration gc = gd.getDefaultConfiguration(); 
      Rectangle screenBounds = gc.getBounds(); 
      if (screenBounds.intersects(parentBounds)) { 
       lstDevices.add(gd); 
      } 
     } 

     if (lstDevices.size() == 1) { 
      device = lstDevices.get(0); 
     } else { 

      GraphicsDevice gdMost = null; 
      float maxArea = 0; 
      for (GraphicsDevice gd : lstDevices) { 
       int width = 0; 
       int height = 0; 

       GraphicsConfiguration gc = gd.getDefaultConfiguration(); 
       Rectangle bounds = gc.getBounds(); 

       Rectangle2D intBounds = bounds.createIntersection(parentBounds); 

       float perArea = (float) ((intBounds.getWidth() * intBounds.getHeight())/(parentBounds.width * parentBounds.height)); 
       if (perArea > maxArea) { 
        maxArea = perArea; 
        gdMost = gd; 
       } 
      } 

      if (gdMost != null) { 
       device = gdMost; 
      } 
     } 
    } 
    return device; 
} 

/** 
* Returns the GraphicsDevice at the specified point 
*/ 
public static GraphicsDevice getGraphicsDeviceAt(Point pos) { 
    GraphicsDevice device = null; 
    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
    GraphicsDevice lstGDs[] = ge.getScreenDevices(); 

    List<GraphicsDevice> lstDevices = new ArrayList<GraphicsDevice>(lstGDs.length); 
    for (GraphicsDevice gd : lstGDs) { 

     GraphicsConfiguration gc = gd.getDefaultConfiguration(); 
     Rectangle screenBounds = gc.getBounds(); 
     if (screenBounds.contains(pos)) { 
      lstDevices.add(gd); 
     } 
    } 

    if (lstDevices.size() > 0) { 
     device = lstDevices.get(0); 
    } 

    return device; 
} 

/** 
* Returns the Point that would allow the supplied Window to be 
* centered on it's current graphics device. 
* 
* It's VERY important that the Window be seeded with a location 
* before calling this method, otherwise it will appear on the 
* device at 0x0 
* 
* @param window 
* @return 
*/ 
public static Point centerOfScreen(Window window) { 
    // Try and figure out which window we actually reside on... 
    GraphicsDevice gd = getGraphicsDeviceAt(window.getLocation()); 
    GraphicsConfiguration gc = gd.getDefaultConfiguration(); 

    Insets screenInsets = Toolkit.getDefaultToolkit().getScreenInsets(gd.getDefaultConfiguration()); 
    Rectangle bounds = gc.getBounds(); 
    Dimension size = bounds.getSize(); 

    size.width -= (screenInsets.left + screenInsets.right); 
    size.height -= (screenInsets.top + screenInsets.bottom); 

    int width = window.getWidth(); 
    int height = window.getHeight(); 

    int xPos = screenInsets.left + ((size.width - width)/2); 
    int yPos = screenInsets.top + ((size.height - height)/2); 

    return new Point(xPos, yPos); 
} 
Verwandte Themen