2009-05-18 6 views
5

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.

Répondre

5

C'est pourquoi item1.getLocation() renvoie toujours la même valeur que toujours au même endroit par rapport au menu contextuel. À la lecture de Javadoc, il semble que l'appel de mainFrame.getMousePosition() pourrait renvoyer le point que vous recherchez.

+0

Bien sûr! La position de la souris !!! Cela fonctionne, merci! - (BTW, getParent(). GetLocation() renvoie également des constantes.) –

5

Ancien fil, mais j'ai eu ce problème récemment. Le problème ici est que lors de l'appel ActionPerformed, la visibilité de PopupMenu a déjà été définie sur false, ce qui signifie que son emplacement n'est plus défini (ie (0,0)). Je développe pour une interface sans souris, donc saisir la position de la souris n'était pas possible pour moi. J'ai fini par stocker la position du menu chaque fois qu'il était visible et l'utiliser pour créer mon composant.

Questions connexes