Jpanel上的弹出菜单, 我在Jpanel上点击右键, 然后将鼠标拖到外面才放开, 结果菜单在窗体外面弹出, 怎么样解决?
代码:  private class MyMouseHandler extends MouseAdapter {
@Override
public void mouseReleased(MouseEvent e) {
if(e.isPopupTrigger()) {
popupMenu.show(e.getComponent(), e.getX(), e.getY());   
            }   
}
}

解决方案 »

  1.   

    e.getX(), e.getY());   这里应该可以传入参数吧
      

  2.   

    谢谢kao331431214, 你意思是? 没大明白
    popupMenu.show(e.getComponent(), e.getX(), e.getY()); 在鼠标释放点弹出菜单, 有没有一种方法, 检测鼠标释放点是否已经在被侦听组件的范围之外? 如果是这样,就不需要弹出菜单
      

  3.   

    getX 和 getY 不能传入参数。如果你要判断鼠标释放点是否已经在侦听组件的范围外的话,
    可以通过getX和getY来获得他们的坐标,然后进行判断。
      

  4.   


    谢谢, 除此之外会有现在成的方法没, 比如 Jpanel提供一种现在的方法来判断某坐标是否落入此Jpanel的范围?
      

  5.   

    你为什么不选择 选取 鼠标右键 按下的时候的坐标来弹出菜单,而是要选择释放鼠标右键释放的时候的坐标来弹出菜单。如果是在Panel上的鼠标按下的坐标,那么不会有你说的问题了啊。
      

  6.   

    我给你个例子,
    你看下,怎么弹出来的。import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;public class UseRightButton extends JFrame implements MouseListener {
    JPanel panel; JLabel display; public UseRightButton() {
    setTitle("Use right button and popup menu");
    setSize(400, 300); panel = new JPanel();
    display = new JLabel("                  ");
    display.setOpaque(true);
    display.setBackground(Color.yellow); panel.add(display); panel.addMouseListener(this);
    display.addMouseListener(this); getContentPane().setLayout(new BorderLayout());
    getContentPane().add(panel, BorderLayout.CENTER);
    } public static void main(String[] args) {
    UseRightButton rb = new UseRightButton();
    rb.setVisible(true);
    } public void mousePressed(MouseEvent e) {
    if (e.getSource() == panel && e.getButton() == MouseEvent.BUTTON3) {
    MyPopupMenu popup = new MyPopupMenu(this);
    popup.show((Component) panel, e.getX(), e.getY());
    } else if (e.getSource() == display
    && e.getButton() == MouseEvent.BUTTON3) {
    MyPopupMenu popup = new MyPopupMenu(this);
    popup.show((Component) display, e.getX(), e.getY());
    }
    } public void mouseEntered(MouseEvent e) {
    } public void mouseExited(MouseEvent e) {
    } public void mouseClicked(MouseEvent e) {
    } public void mouseReleased(MouseEvent e) {
    }
    }
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;import javax.swing.JMenuItem;
    import javax.swing.JPopupMenu;public class MyPopupMenu extends JPopupMenu implements ActionListener {
    JMenuItem sayHello, sayHelloAgain, sayByeBye; UseRightButton useRightButton; public MyPopupMenu(UseRightButton urb) { useRightButton = urb; sayHello = new JMenuItem("Say Hello");
    sayHelloAgain = new JMenuItem("Say Hello again");
    sayByeBye = new JMenuItem("Say Bye Bye"); sayHello.addActionListener(this);
    sayHelloAgain.addActionListener(this);
    sayByeBye.addActionListener(this); add(sayHello);
    this.addSeparator();
    add(sayHelloAgain);
    add(sayByeBye);
    } public void actionPerformed(ActionEvent e) {
    if (e.getSource() == sayHello) {
    System.out.println();
    useRightButton.display.setText("Hello!");
    } else if (e.getSource() == sayHelloAgain) {
    System.out.println("Hello! Hello!");
    useRightButton.display.setText("Hello! Hello!");
    } else if (e.getSource() == sayByeBye) {
    System.out.println("Bye Bye!");
    useRightButton.display.setText("Bye Bye!");
    }
    } static boolean foo(char c) {
    System.out.print(c);
    return true;
    } public static void main(String[] argv) {
    int i = 0;
    for (foo('A'); foo('B') && (i < 2); foo('C')) {
    i++;
    foo('D');
    }
    }
    }
      

  7.   

    我给你的例子中 MyPopupMenu.java类里面,
    foo 方法和 main 是不需要的,我在做测试的时候留下的,
    忘记删除了,
    你不须理会。