代码之家  ›  专栏  ›  技术社区  ›  Hamza Yerlikaya

jpopupmenu行为

  •  2
  • Hamza Yerlikaya  · 技术社区  · 15 年前

    我在下面准备了一个小测试用例。我的问题是右键单击窗口。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 回复  |  直到 13 年前
        1
  •  1
  •   Devon_C_Miller    15 年前

    看一下Java文档 JWindow.isFocusableWindow jWindow不能是焦点窗口,除非它有所有者并且所有者可见。 您使用的是默认的构造函数,因此jWindow具有共享所有者asn is not focusable。当它不可聚焦时,当你点击其他地方时,它无法检测到焦点的丢失。

    我变了 JWindow JFrame 并向添加了一个呼叫 setUndecorated(true); 在呼叫之前 setVisible 这对我很有效。如果这些更改不能使您工作,请张贴您正在使用的Java版本: java -fullversion

        2
  •  0
  •   akf    15 年前

    在Windows 6中的Java中,我不能用您提供的代码来显示弹出窗口。另一方面,如果我将超类更改为JFrame,它将按需工作,当我单击窗口外时弹出窗口将消失。你为什么要用 JWindow 作为你的超类而不是 JFrame 是吗?如果您希望有一个无边框/无标题窗口,可以调用 setUndecorated(true) 对你 窗口 (当然,在设置可见和打包之前。)

        3
  •  0
  •   JRL    15 年前

    如果菜单在 MouseExited 方法?