JPopupMenu行为

时间:2009-09-30 15:16:22

标签: java swing jpopupmenu

我在下面准备了一个小测试案例。我的问题是当我右键单击窗口时。 JPopupMenu出现但如果我点击JWindow菜单外的任何地方都不会消失。我必须点击窗口上的某个地方来摆脱它,这不是预期的行为。

编辑: 在阅读akf的答案后,我切换到JFrame,当帧处于焦点并且弹出菜单显示时,当您单击另一个窗口时它会消失。但如果窗口没有焦点,你单击某处菜单不会消失。


import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

class test {

    static class window extends JWindow
    implements MouseListener, MouseMotionListener{

    JPopupMenu popMenu;
    JPanel panel = new JPanel();

    Point location;
    MouseEvent pressed;

    public window(){

        addMouseListener( this );
        addMouseMotionListener( this );

        JLabel label = new JLabel("JWindow", JLabel.CENTER);

        initPopMenu();
        add(label);
        setVisible(true);
        setAlwaysOnTop(true);
        setLocationRelativeTo(null);
        pack();
    }

    public void initPopMenu(){
        popMenu = new JPopupMenu();
        JMenuItem item;

        item = new JMenuItem( "Title" );
        item.setEnabled(false);
        popMenu.add(item);
        popMenu.addSeparator();

        item = new JMenuItem( "Item One" );
        popMenu.add(item);

        item = new JMenuItem( "Item 2" );
        popMenu.add(item);

        item = new JMenuItem( "Item 3" );
        popMenu.add(item);
    }

    public void mousePressed(MouseEvent e)
    {
        pressed = e;
        int nModifier = e.getModifiers();
        if (((nModifier & InputEvent.BUTTON2_MASK) != 0)||
        ((nModifier & InputEvent.BUTTON3_MASK) != 0))
        popMenu.show( this, e.getX(), e.getY() );
    }

    public void mouseClicked(MouseEvent e) {
    }


    public void mouseReleased(MouseEvent e) {}

    public void mouseDragged(MouseEvent me){
    }

    public void mouseMoved(MouseEvent e) {}
    public void mouseEntered(MouseEvent e) {}
    public void mouseExited(MouseEvent e) {}
    }
    public static void main(String[] args) {
    window dw = new window();
    }
}

3 个答案:

答案 0 :(得分:1)

查看JWindow.isFocusableWindow的Java文档 除非拥有所有者且所有者可见,否则JWindow不能成为焦点窗口。 您正在使用默认构造函数,因此您的JWindow具有共享所有者asn不可聚焦。当它不可聚焦时,当你点击其他地方时它无法检测到失去焦点。

我将JWindow更改为JFrame并在致电setUndecorated(true);之前添加了对setVisible的电话,这对我有用。如果这些更改不适合您,请发布您正在使用的Java版本:java -fullversion

答案 1 :(得分:0)

在Windows上的Java 6中,我无法使用您提供的代码显示弹出窗口。另一方面,如果我将您的超类更改为JFrame,它会按照需要运行,当我在窗口外单击时弹出窗口会消失。您是否有理由使用JWindow作为超类,而不是JFrame?如果您希望拥有无边框/无标题窗口,可以在setUndecorated(true)上致电JFrame(当然,在设置可见和打包之前。)

答案 2 :(得分:0)

如果菜单在MouseExited方法中可见,隐藏菜单怎么样?