2009-05-18 3 views
5

Ho problemi a trovare la posizione JPopupMenu.Ottenere la posizione di JPopupMenu

cosa ho bisogno è di essere in grado di fare clic destro sull'area di lavoro, fare clic su alcuni
voce di menu, e quindi creare un elemento in atto proprio sotto la posizione del menu visualizzato in precedenza.

ho cercato di ottenere la posizione del menu stesso e dei suoi elementi,
ma mi dà valori costanti circa 0. (vedi commenti nel codice)

A causa della separazione degli interessi , il menu viene visualizzato in una classe
mentre le sue azioni sono gestite in un'altra.

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

} 

So che potrei memorizzare l'ultima nota posizione in PopupMouseListener, e leggerlo da MainFrameMenu, ma sarebbe rovinare le classi gerarchia (la maggior parte delle altre occorrenze PopupMouseListener don' ne ho bisogno).

risposta

5

getLocation() restituisce la posizione relativa allo spazio di coordinate dei componenti principali. Questo è il motivo per cui item1.getLocation() restituisce sempre lo stesso valore di sempre nella stessa posizione rispetto al menu popup.

Dalla lettura di Javadoc sembra che chiamare mainFrame.getMousePosition() possa restituire il punto che si sta cercando.

+0

Naturalmente! La posizione del mouse !!! Funziona, grazie! - (BTW, getParent(). GetLocation() restituisce anche le costanti.) –

5

Vecchio thread, ma ho avuto questo problema di recente. Il problema qui è che durante la chiamata ActionPerformed, la visibilità del PopupMenu è già stata impostata su false, il che significa che la sua posizione non è più definita (es. (0,0)). Sto sviluppando un'interfaccia senza mouse, quindi per me non è stato possibile afferrare la posizione del mouse. Ho finito per memorizzare la posizione del menu ogni volta che veniva reso visibile e usando quello per creare il mio componente.