2009-05-18 7 views
5

JPopupMenuの位置はです。私は必要なものJPopupMenuの位置を取得する

は、作業領域で右クリックいくつかの
メニュー項目をクリックし、右の前に表示されるメニューの位置を下で行わに要素を作成できるようにすることです。

私は、メニュー自体の、そのアイテムの位置を取得しようとした
が、それはそのための懸念の分離の私に定数値 0付近(コード内のコメントを参照してください)

を与えるメニューは1つのクラス
に表示され、そのアクションは別のクラスで処理されます。

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

} 

私は 、PopupMouseListener最後の既知の位置を保存し、MainFrameMenuからそれを読むことができる知っているが、それはクラス 階層PopupMouseListenerドン」は(他のほとんどの出現を台無しにそれが必要です)。

答えて

5

getLocation()親コンポーネントの座標空間を基準にした相対的な位置を返します。このため、item1.getLocation()は常にポップアップメニューと同じ位置に常に同じ値を返します。

Javadocを読むと、mainFrame.getMousePosition()を呼び出すと、探しているポイントが返されるように聞こえます。

+0

もちろん!マウスの位置!!!それは動作します、ありがとう! - (BTW、getParent()。getLocation()も定数を返します。) –

5

古いスレッドですが、最近この問題が発生しました。ここでの問題は、ActionPerformed呼び出し中にPopupMenuの可視性がfalseに設定されていることです。つまり、その位置が定義されていないことを意味します(つまり、(0,0))。私はマウスレスのインターフェースを開発しているので、マウスの位置をつかむことはできませんでした。私はメニューが表示されるたびにそのメニューの位置を保存し、それを使用してコンポーネントを作成しました。

関連する問題