2009-05-18 10 views
5

Tengo problemas para obtener JPopupMenu en la posición.Obteniendo la posición de JPopupMenu

Lo que necesito es ser capaz de hacer clic derecho sobre el área de trabajo, haga clic en alguna
elemento de menú, y luego crear un elemento en su lugar justo debajo de la posición del menú que se muestra anteriormente.

he intentado conseguir la posición del menú en sí y de sus elementos,
pero me da valores constantes alrededor de 0. (ver comentarios en el código)

Debido a separación de las preocupaciones , el menú se muestra en una clase
mientras sus acciones se manejan en otra.

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()); 
    } 
    } 

} 

Sé que podría almacenar el última posición conocido en PopupMouseListener, y leerlo desde MainFrameMenu, pero arruinaría las clases jerarquía (la mayoría de las otras apariciones de PopupMouseListener Don' lo necesito).

Respuesta

5

getLocation() devuelve la ubicación relativa al espacio de coordenadas de los componentes principales. Esta es la razón por la cual item1.getLocation() siempre devuelve el mismo valor ya que siempre está en la misma ubicación relativa al menú emergente.

Al leer el Javadoc, suena como llamar a mainFrame.getMousePosition() podría devolver el punto que está buscando.

+0

¡Por supuesto! La posición del mouse !!! Funciona, gracias! - (BTW, getParent(). GetLocation() también devuelve constantes). –

5

Tema viejo, pero tuve este problema recientemente. El problema aquí es que durante la llamada ActionPerformed, la visibilidad del PopupMenu ya se ha establecido en falso, lo que significa que su ubicación ya no está definida (es decir, (0,0)). Estoy desarrollando una interfaz sin mouse, por lo que no fue posible agarrar la posición del mouse. Terminé almacenando la posición del menú cada vez que se hizo visible y usé eso para crear mi componente.

Cuestiones relacionadas