java jpopupmenu事件_java – 如何通过单击外部来关闭JPopupMenu时阻止触发其他事件?...

考虑到您的问题和评论中所说的内容,我会通过以下方式之一解决您的问题.

从技术上讲,你有两个选择:

1.每当用户将鼠标移动到弹出窗口之外时,隐藏弹出窗口.这样您就不会遇到用户点击的问题,因为弹出窗口会自动消失.

2.全局捕获此特定鼠标事件,如果弹出窗口可见,则在左键单击时使用该事件.我在下面的例子中展示了这个特定的解决方案

import java.awt.AWTEvent;

import java.awt.Toolkit;

import java.awt.event.AWTEventListener;

import java.awt.event.ActionEvent;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

import javax.swing.AbstractAction;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JMenu;

import javax.swing.JPanel;

import javax.swing.JPopupMenu;

import javax.swing.SwingUtilities;

public class DisableClickWhenPopupVisibleTest

{

public static void main(String[] args)

{

SwingUtilities.invokeLater(new Runnable()

{

@Override

public void run()

{

final JPopupMenu popup = new JPopupMenu();

popup.add(new JMenu("aAaa"));

JPanel contentPane = new JPanel();

contentPane.add(popup);

JButton b = new JButton();

b.setAction(new AbstractAction("Button")

{

private static final long serialVersionUID = 1L;

@Override

public void actionPerformed(ActionEvent e)

{

System.out.println("b actionPerformed");

}

});

contentPane.add(b);

contentPane.addMouseListener(new MouseAdapter() {

@Override

public void mousePressed(MouseEvent e)

{

showPopup(e);

}

@Override

public void mouseReleased(MouseEvent e)

{

showPopup(e);

}

private void showPopup(MouseEvent e)

{

if(e.isPopupTrigger())

popup.show(e.getComponent(), e.getX(), e.getY());

}

});

//use global mouse event capture to disable left click on anything when popup is visible

Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {

@Override

public void eventDispatched(AWTEvent event)

{

MouseEvent me = (MouseEvent)event;

if(me.getID() == MouseEvent.MOUSE_PRESSED)

{

System.out.println("eventDispatched popup.vis="+popup.isVisible());

if( me.getButton() == MouseEvent.BUTTON3)

{

System.out.println("BUTTON3");

}

else if(me.getButton() == MouseEvent.BUTTON1)

{

System.out.println("BUTTON1");

if(popup.isVisible())

me.consume();

}

}

}

}, AWTEvent.MOUSE_EVENT_MASK);

JFrame f = new JFrame();

f.setContentPane(contentPane);

f.setSize(400, 300);

f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

f.setVisible(true);

}

});

}

}

您可以通过右键单击按钮左侧稍微测试该示例,然后弹出窗口将显示.然后,如果单击按钮,则不会调用其操作.如果隐藏弹出窗口,则会正常调用该操作.此功能由以下代码行Toolkit.getDefaultToolkit().addAWTEventListener(…)提供.您可以注释掉该行,然后观察该动作将在您目前遇到的任何情况下发生.

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值