JPopupMenu Behavior

五迷三道 提交于 2020-01-02 10:00:10

问题


I prepared a small test case below. My problem is when i right click on the window. JPopupMenu show up but if i click anywhere outside the JWindow menu does not disappear. I have to click somewhere on the window to get rid of it which is not the expected behavior.

EDIT: after reading akf's answer i switched to JFrame, when frame is in focus and pop up menu is showing it disappears when you click on another window. but if the window does not have focus and you click somewhere menu does not disappear.


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();
    }
}

回答1:


Take a look at the Java Doc for JWindow.isFocusableWindow A JWindow cannot be the focused window unless it has an owner and the owner is visible. You're using the default constructor, so your JWindow has the shared owner asn is not focusable. When it is not focusable, it cannot detect the loss of focus when you click somewhere else.

I changed JWindow to JFrame and added a call to setUndecorated(true); before the call to setVisible and it's working for me. If these changes do not make it work for you, please post the version of Java you are using: java -fullversion




回答2:


In Java 6 on Windows, I cannot get the popup to even display with the code you have provided. On the other hand, if I change your superclass to JFrame, it works as desired, with the popup going away when I click outside of the window. Is there a reason why you are using JWindow as your superclass and not JFrame? If you wish to have a border-less/title-less window, you can call setUndecorated(true) on your JFrame (before you set visible and pack, of course.)




回答3:


What about hiding the menu if it's visible from within the MouseExited method?



来源:https://stackoverflow.com/questions/1498789/jpopupmenu-behavior

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!