当点击它的JPopupMenu时,JPopupPanel关闭



我有一个JPopupPanel显示当一个按钮被点击。

这个JPopupPanel有一个JPopupMenu显示鼠标右键,显示不同的选项。当按下左键选择PopupMenu中的一个选项时,PopupPanel关闭,离开PopupMenu本身一会儿,当按钮被释放时,PopupMenu也消失了(如预期的那样),但是在PopupPanel中看不到这个动作,因为它已经关闭了。

我怎么能避免JPopupPanel关闭时选择一个选项的JPopupMenu?

谢谢

对不起,我没有使用JPopupPanel的经验。因此,我只能提供一个简单的hack

我怀疑你可以做类似的事情,在我的例子(下面),我"忽略"隐藏弹出菜单的选项选择。

我的方法是在选项选择上重新显示弹出式菜单。因此,也许你可以尝试在隐藏面板时重新显示面板。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.SwingUtilities;
public class JPopupMenuIgnoreOptionCloseOnClick extends JPanel
{
    private static final long serialVersionUID = 1L;
    private JPopupMenu popup = new JPopupMenu("Oi I am popup");
    private MouseListener mL = new MouseAdapter()   
    {
        @Override
        public void mousePressed(MouseEvent e)
        {
            System.out.println("mL mousePressed e.isP="+e.isPopupTrigger());
            super.mousePressed(e);
            showPopup(e);
        }
        @Override
        public void mouseReleased(MouseEvent e)
        {           
            System.out.println("mL mouseReleased e.isP="+e.isPopupTrigger());
            super.mouseReleased(e);
            showPopup(e);
        }
        private void showPopup(MouseEvent e)
        {
            if(e.isPopupTrigger())
            {
                prevLocation = e.getPoint();
                popup.show(e.getComponent(), e.getX(), e.getY());
            }
        }
    };
    private Point prevLocation = null;
    private MouseListener optionML = new MouseAdapter()
    {
        @Override
        public void mouseReleased(MouseEvent e)
        {
            System.out.println("optionML mouseReleased prevLocation="+prevLocation);
            e.consume();
            popup.show(JPopupMenuIgnoreOptionCloseOnClick.this, prevLocation.x,prevLocation.y);
        } 
    };
    public JPopupMenuIgnoreOptionCloseOnClick()
    {
        addMouseListener(mL);
        JMenuItem opt1 =new JMenuItem("Option 1");
        opt1.addMouseListener(optionML);
        popup.add(opt1);
        JMenuItem opt2 =new JMenuItem("Option 2");
        opt2.addMouseListener(optionML);
        popup.add(opt2);
        JMenuItem opt3 =new JMenuItem("Option 3");
        opt3.addMouseListener(optionML);
        popup.add(opt3);
    }
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable() 
        {
            @Override
            public void run()
            {           
                JPopupMenuIgnoreOptionCloseOnClick p = new JPopupMenuIgnoreOptionCloseOnClick();
                p.setPreferredSize(new Dimension(400, 400));
                JPanel contentPane = new JPanel();
                contentPane.setBackground(Color.CYAN);
                contentPane.add(p);
                JFrame f = new JFrame();        
                f.setContentPane(contentPane);
                f.setSize(800, 600);
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setVisible(true);
            }
        });
    }   
}

我在JCommandButton上安装自定义JPopupMenu时遇到了这个问题。对于JCommandButton,我发现这有助于防止过早处理父弹出框:

this.putClientProperty(BasicCommandButtonUI.DONT_DISPOSE_POPUPS, true);

如果你正在寻找的是,而不是在JPopupMenu JMenuItem选择,父弹出面板将保持打开,你有几个选项。这个问题源于UI所依赖的祖先容器链中JPopupMenu的断开链接。您需要返回getInvoker()而不是getParent()。

1:
修改basicpopuppanelui . windowtracker . event分派()中的库源。要么更改 swinguutilities . get祖宗ofclass()调用,以使用SwingXUtilities. get祖宗ofclass()来处理这种特殊情况。或者自己实现逻辑。

if(parent instanceof JPopupMenu)  parent = ((JPopupMenu)parent).getInvoker()

2:

将此代码添加到小部件(CustomButton?)

 final JPopupMenu popper = new JPopupMenu(){  //hack
        @Override public Container getParent(){
            StackTraceElement ste = Thread.currentThread().getStackTrace()[2];
            if(ste.getClassName().equals(SwingUtilities.class.getName()))
                return CustomButton.this.getParent();
            return super.getParent();
        }
    };

我选择了#2,因为我对修改第三方库有问题。

相关内容

  • 没有找到相关文章

最新更新