7
votes

Comment comprendre à quel écran un JDialog est affiché

J'ai une très grande application qui a plusieurs boîtes de dialogue. Ma tâche consiste à vous assurer qu'une boîte de dialogue, qui n'est pas complètement visible (car l'utilisateur l'a tiré hors de la zone d'écran visible) est replacé au centre de l'écran.

Ce n'est pas un problème lorsque je ne traite qu'un seul écran. Cela fonctionne simplement ... Cependant, la plupart des utilisateurs de cette application ont deux écrans sur leur bureau ...

Lorsque j'essaie de déterminer à quel écran la boîte de dialogue est affichée et centrée sur cet écran spécifique , ... Eh bien, il est en fait centre, mais sur l'écran principal (ce qui peut ne pas être l'écran, la boîte de dialogue est affichée).

Pour vous montrer ce que mes pensées étaient jusqu'à présent, voici le code ... xxx

tout en débogage, je suis un peu abordé le fait que GetactivesCreen () ne semble pas fonctionner comme ça; Il semble toujours retourner 2 (ce qui est une sorte de merde, car cela signifie que la boîte de dialogue est toujours affichée dans le deuxième moniteur ... ce qui n'est bien sûr pas la vérité).

Quelqu'un a une idée de la procédure à suivre ma boîte de dialogue sur l'écran.


3 commentaires

Combien d'écrans appellera l'application sur plusieurs écrans?


Je ne suis pas tout à fait sûr si je reçois votre question, mais si je l'ai bien compris, je ne sais pas. Cela n'a même pas d'importance, car la position des dialogues est enregistrée et vérifiée chaque fois que la boîte de dialogue est visible ... Est-ce que cela répond à votre question? :-)


Pourquoi ne spécifiez-vous pas l'emplacement à l'écran de la boîte de dialogue?


3 Réponses :


0
votes

Voici le code utilisé pour centrer l'emplacement de la fenêtre. xxx

avec le cadre Vous pouvez également utiliser la boîte de dialogue.


1 commentaires

Cela ne répond pas à la question. Il dit simplement comment le faire dans un environnement unique (dont OP a été déclaré fonctionne déjà pour lui) ...



1
votes

Votre getactiveCreen Méthode a fonctionné, sauf qu'il a utilisé l'écran contenant le coin supérieur gauche de la fenêtre. Si vous utilisez un composant.GetGraphicsConfiguration () à la place, il vous donnera à quel écran la plupart des pixels de la fenêtre. SetLocessionRelativeto (NULL) n'est pas une aide ici car il utilise toujours l'écran principal. Voici comment le résoudre: xxx

alors vous pouvez faire: xxx

qui centrifiera la boîte de dialogue à l'écran le plus proche (moniteur). Vous devrez peut-être vous assurer que la boîte de dialogue a été initialement affichée / positionnée en premier.


1 commentaires

Merci pour votre réponse :-) Cela ne fonctionne pas à 100% de la façon dont j'ai initialement voulu que cela fonctionne, mais le comportement est bien correct maintenant :-) Merci beaucoup! :-)



1
votes

Je ne sais pas à quel point cela sera utile, mais c'est le code que j'utilise lorsque j'essaie de déterminer les périphériques graphiques pour Windows.

Je triche un peu, j'ai tendance à utiliser composant code> et permet aux méthodes utilitaires de trouver la fenêtre de niveau supérieur ou d'utiliser le point d'écran Composant CODE> S. P>

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


0 commentaires