import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JWindow;public class Main { public Main() {
} static public class PopupListener extends MouseAdapter {
JPopupMenu menu; public PopupListener(JPopupMenu menu) {
this.menu = menu;
} public void mousePressed(MouseEvent e) {
showPopup(e);
} public void mouseReleased(MouseEvent e) {
showPopup(e);
} private void showPopup(MouseEvent e) {
if (e.isPopupTrigger()) {
 
menu.show(e.getComponent(), e.getX(), e.getY()); System.out.println("Showing menu at "
+ menu.getLocationOnScreen() + " isVisible: "
+ menu.isVisible() + " isValid: " + menu.isValid());
}
}
}  
public static void main(String[] args) {
JWindow window = new JWindow();
window.setBounds(10, 10, 100, 100); JPopupMenu popupMenu = new JPopupMenu();
JMenuItem quit = new JMenuItem("Quit");
quit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
popupMenu.add(quit); window.addMouseListener(new PopupListener(popupMenu));
window.setFocusable(true); window.validate();
window.setVisible(true);
}}上面是例子,运行后会发现,在那个JWindow上点击右键会出现"quit"的弹出菜单,在JWindow上点击左键弹出菜单会消失.....这没有问题.....问题是,将鼠标移到jwindow之外的区域点击,弹出菜单不会消失.............求解决办法.....................

解决方案 »

  1.   

    window之外的区域,你指的是什么?
    通常一个JWindow对象不会单独存在,它的用法,你也不要当作一个普通的窗体来用。而且,有些情况下是必须指定其所有者的。请参考如下代码,你会发现Jwindow我添加了一个JTextField,是否可以编辑,什么时候可编辑,自己体会
    package test;import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JMenuItem;
    import javax.swing.JPopupMenu;
    import javax.swing.JTextField;
    import javax.swing.JWindow;public class Main { public Main() {
    } static public class PopupListener extends MouseAdapter {
    JPopupMenu menu; public PopupListener(JPopupMenu menu) {
    this.menu = menu;
    } public void mousePressed(MouseEvent e) {
    showPopup(e);
    } public void mouseReleased(MouseEvent e) {
    showPopup(e);
    } private void showPopup(MouseEvent e) {
    if (e.isPopupTrigger()) { menu.show(e.getComponent(), e.getX(), e.getY()); System.out.println("Showing menu at "
    + menu.getLocationOnScreen() + " isVisible: "
    + menu.isVisible() + " isValid: " + menu.isValid());
    }
    }
    } public static void main(String[] args) {
    final JFrame f = new JFrame(); JButton btn = new JButton("show window");
    f.getContentPane().add(btn, BorderLayout.SOUTH);
    f.getContentPane().add(new JTextField());
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    btn.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    // 这里尝试一下如果换为new JWindow会发生什么
    JWindow window = new JWindow();
    // window.setBounds(10, 10, 100, 100);
    window.getContentPane().add(new JTextField(30),
    BorderLayout.NORTH);
    window.getContentPane().setBackground(Color.cyan);
    window.setSize(300, 100);
    window.setLocationRelativeTo(null); final JPopupMenu popupMenu = new JPopupMenu();
    JMenuItem quit = new JMenuItem("Quit");
    quit.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    System.exit(0);
    }
    });
    popupMenu.add(quit); window.addMouseListener(new PopupListener(popupMenu));
    window.addWindowFocusListener(new WindowAdapter() {
    @Override
    public void windowGainedFocus(WindowEvent e) {
    // TODO Auto-generated method stub
    super.windowGainedFocus(e);
    System.out.println("gain");
    } @Override
    public void windowLostFocus(WindowEvent e) {
    // TODO Auto-generated method stub
    super.windowLostFocus(e);
    System.out.println("lose");
    }
    }); window.setFocusable(true); window.validate();
    window.setVisible(true); }
    });
    f.setSize(800, 600);
    f.setLocationRelativeTo(null);
    f.setVisible(true); }}:
      

  2.   


    那个jwindow不是一个矩形么? window之外的区域就是指 那个矩形之外的区域..........
    另外,我点击了好多下都没见输出"gain"和"lose"................
      

  3.   

    呵呵,抱歉,是我疏忽了。请看一下
    JWindow window = new JWindow();

    JWindow window = new JWindow(f);
    的差别。
      

  4.   


    我是在一个用JWindow实现悬浮窗的例子里遇到这种菜单不能自动消失的情况的, 主类继承了JWindow,似乎没有父窗体...........我再试试加个JFrame作为JWindow的父窗体...................................
      

  5.   

    运行了一下lz的代码,没遇到lz说的情况。
    ubuntu 8.04 + java 6u21
      

  6.   


    我的是win7, 用java -fullversion 查看到的是 1.6.0_21-b06........可能是因为你的是linux?