web-dev-qa-db-fra.com

Centrer JDialog sur le parent

J'ai une application Java swing avec un bouton qui produit une fenêtre contextuelle lorsqu'une certaine action est effectuée. Je voudrais aligner le point central de la fenêtre contextuelle avec le point central du parent fenêtre quand elle est rendue. Comment puis-je calculer les coordonnées x, y à brancher dans setLocation() pour la fenêtre popup?

Juste pour clarifier. Je ne veux pas le comportement de setLocationRelativeTo() car cela définit le pixel supérieur gauche de la fenêtre contextuelle sur le pixel central du cadre parent. Je veux définir le pixel central de la fenêtre contextuelle sur le pixel central du cadre parent.

29
Chris Drappier

setLocationRelativeTo ..ceci définit le pixel supérieur gauche de la fenêtre contextuelle sur le pixel central du parent. ..

Non!

Centered Dialog

Chacune des 3 boîtes de dialogue affichées par cet exemple simple semble être centrée autant que je puisse voir. Je peux seulement deviner que le code appelle setLocationRelativeTo au mauvais moment.

import javax.swing.*;

class CenterTheDialog {

    CenterTheDialog() {
        for (int ii=1; ii<4; ii++) {
            JFrame f = new JFrame("Frame " + ii);
            f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

            f.setSize(400,300);
            f.setLocationByPlatform(true);
            f.setVisible(true);

            JDialog d = new JDialog(f);
            d.setSize(300,200);
            d.setLocationRelativeTo(f);
            d.setVisible(true);
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            new CenterTheDialog();
        });
    }
}
47
Andrew Thompson

Sur le JDialog que vous avez créé, vous devez d'abord appeler pack(), puis setLocationRelativeTo(parentFrame), puis setVisible(true). Avec cet ordre, le JDialog doit apparaître centré sur le cadre parent.

Si vous n'appelez pas d'abord pack(), la définition de l'emplacement par rapport au parent ne fonctionne pas correctement car JDialog ne sait pas de quelle taille il s'agit à ce stade. Il semble que la taille soit de 0 par 0, ce qui se traduit par le positionnement du "pixel supérieur gauche de la fenêtre contextuelle sur le pixel central du parent" mentionné dans un commentaire à l'une des autres réponses.

56
MB.
5
Jeffrey

Vous pouvez utiliser l'événement e pour obtenir la fenêtre parent. Utilisez getWindowAncestor et e.getSource().

dialog.setLocationRelativeTo(SwingUtilities.getWindowAncestor((Component) e.getSource()))

3
sixtytrees

Vous pouvez essayer de passer les coordonnées de la fenêtre parent et sa taille à la nouvelle fenêtre et ajouter les coordonnées + 1/2 taille du cadre parent dans chaque axe - 1/2 des fenêtres contextuelles x/y pour se centrer sur le centre.

Ou ... Si vous étendez, vous pouvez utiliser setLocationRelativeTo (propriétaire)

J'espère que cela t'aides

2
Phil