2009-05-18 4 views
5

प्राप्त करना मुझे JPopupMenu की स्थिति प्राप्त करने में समस्या हो रही है।JPopupMenu की स्थिति

मैं क्या जरूरत है, कार्य क्षेत्र पर राइट क्लिक कुछ
मेनू आइटम क्लिक करें और फिर सही पहले से दिखाया गया मेनू की स्थिति के तहत जगह में एक तत्व बनाने के लिए सक्षम होने के लिए है।

मैं मेनू ही की और उसके मदों की स्थिति हो रही है की कोशिश की,
लेकिन यह मुझे निरंतर मूल्यों देता है 0. चारों ओर (कोड में टिप्पणियों को देखने के)

चिंताओं में से जुदाई की वजह से , मेनू एक वर्ग
में प्रदर्शित होता है जबकि इसके कार्यों को दूसरे में संभाला जाता है।

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() हमेशा वही मान देता है क्योंकि यह हमेशा पॉपअप मेनू से संबंधित एक ही स्थान पर होता है।

जावाडोक पढ़ने से यह मुख्यफ्रेम को कॉल करने जैसा लगता है .getMousePosition() उस बिंदु को वापस कर सकता है जिसे आप ढूंढ रहे हैं।

+0

बेशक! माउस की स्थिति !!! यह काम करता है, धन्यवाद! - (बीटीडब्ल्यू, getParent()। GetLocation() भी स्थिरांक वापस।) –

5

पुराना धागा, लेकिन मुझे हाल ही में यह समस्या थी। यहां समस्या यह है कि एक्शनप्रोर्फ़ेड कॉल के दौरान, पॉपअपमेनू की दृश्यता को पहले से ही गलत पर सेट कर दिया गया है, जिसका अर्थ है कि इसका स्थान अब परिभाषित नहीं किया गया है (यानी (0,0))। मैं एक बेकार इंटरफ़ेस के लिए विकास कर रहा हूं, इसलिए माउस की स्थिति को पकड़ना मेरे लिए संभव नहीं था। जब भी यह दिखाई देता था और मेरा घटक बनाने के लिए इसका उपयोग करते हुए मेनू की स्थिति को संग्रहीत करता था।