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.
setLocationRelativeTo
..ceci définit le pixel supérieur gauche de la fenêtre contextuelle sur le pixel central du parent. ..
Non!
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();
});
}
}
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.
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()))
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