2009-05-18 4 views
5

Ich habe Probleme, JPopupMenu 's Position zu bekommen.JPopupMenus Position erhalten

Was ich brauche, ist in der Lage sein, einige
Menüpunkt nach rechts klicken Sie auf den Arbeitsbereich, und klicken Sie dann ein Element erstellen anstelle direkt unter der Position des zuvor angezeigten Menü.

Ich habe versucht, die Position des Menüs selbst immer und seine Einzelteile,
aber es gibt mir konstante Werte um 0 (Kommentare im Code sehen)

Wegen Trennung von Bedenken wird das Menü in einer Klasse
angezeigt, während seine Aktionen in einem anderen behandelt werden.

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

} 

Ich weiß, dass ich die bekannt letzte Position in PopupMouseListener, und von MainFrameMenu lesen speichern könnte, aber es würde die Klassen Hierarchie (die meisten anderen Vorkommen von PopupMouseListener don ruinieren‘ t brauche es).

Antwort

5

getLocation() gibt die Position relativ zum Koordinatenraum der übergeordneten Komponenten zurück. Aus diesem Grund gibt item1.getLocation() immer denselben Wert zurück, der immer an der gleichen Stelle relativ zum Popup-Menü ist.

Vom Lesen der Javadoc klingt es wie Aufruf von mainFrame.getMousePosition() könnte den Punkt, den Sie suchen, zurückgeben.

+0

Natürlich! Die Mausposition !!! Es funktioniert, danke! - (BTW, getParent(). GetLocation() gibt auch Konstanten zurück.) –

5

Alter Thread, aber ich hatte dieses Problem vor kurzem. Das Problem besteht darin, dass die Sichtbarkeit von PopupMenu während des Aufrufs von ActionPerformed bereits auf "false" gesetzt wurde, was bedeutet, dass die Position des PopupMenu nicht mehr definiert ist (z. B. (0,0)). Ich entwickle für eine mauslose Schnittstelle, also war es für mich nicht möglich, die Position der Maus zu erfassen. Ich speicherte die Position des Menüs jedes Mal, wenn es sichtbar gemacht wurde, und benutzte das, um meine Komponente zu erstellen.

Verwandte Themen