J'ai des difficultés à obtenir JPopupMenu
's position.Obtenir la position de JPopupMenu
Ce que je besoin est de pouvoir un clic droit sur la zone de travail, cliquez sur une option de menu
, puis créez un élément en place juste sous la position du menu affiché précédemment.
J'ai essayé d'obtenir la position du menu lui-même et de ses éléments,
mais il me donne des valeurs constantes autour de 0. (voir les commentaires dans le code)
En raison de la séparation des préoccupations , le menu est affiché dans une classe
tandis que ses actions sont traitées dans un autre.
public final class MainFrameMenu
extends JPopupMenu
implements ActionListener {
private final MainFrame mainFrame;
private final JMenuItem item1 = new JMenuItem("add line");
private final JMenuItem item2 = new JMenuItem("add element");
public MainFrameMenu(MainFrame mainFrame) {
super("Main menu");
this.mainFrame = mainFrame;
item1.addActionListener(this);
item2.addActionListener(this);
add(item1);
add(item2);
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == item1) {
System.out.println(getLocation()); // gives ALWAYS [0, 0]
System.out.println(item1.getLocation()); // gives ALWAYS [1, 3]
// I want to create an element IN PLACE
mainFrame.addConnectionLine(getX(), getY());
}
}
}
public final class PopupMouseListener
extends MouseAdapter {
private final JPopupMenu menu;
public PopupMouseListener(JPopupMenu menu) {
this.menu = menu;
}
@Override
public void mousePressed(MouseEvent e) {
popup(e);
}
@Override
public void mouseReleased(MouseEvent e) {
popup(e);
}
private void popup(MouseEvent e) {
if (e.isPopupTrigger()) {
menu.show(e.getComponent(), e.getX(), e.getY());
}
}
}
Je sais que je pourrais enregistrer la dernière position connue dans PopupMouseListener
, et lire de MainFrameMenu, mais il ruinerait les classes hiérarchie (la plupart des autres occurrences de PopupMouseListener
n » J'en ai besoin). GetLocation() renvoie l'emplacement relatif à l'espace de coordonnées des composants parents.
Bien sûr! La position de la souris !!! Cela fonctionne, merci! - (BTW, getParent(). GetLocation() renvoie également des constantes.) –