2012-07-12 174 views
2

我在主Jframe上实现了打开菜单侦听器的右键单击,除了一个问题外,它工作正常。五分之一(给予或带走)点击它没有响应,这对用户来说可能非常烦人。这里是我的代码:Java Swing中的MouseListener有时不响应

contentPane = new JPanel(); 
contentPane.addMouseListener(new MouseAdapter() { 

     @Override 
     public void mouseClicked(MouseEvent e) { 

      if (e.getButton() == MouseEvent.BUTTON3) 
      { 
       //Do Stuff 
      } 
     } 
    }); 

能否请你帮我

+0

连续五分之一?或者每5次出现? – 2012-07-12 13:47:47

+0

可能是因为长时间运行的进程阻止了EventDispatchingThread运行? – MadProgrammer 2012-07-12 13:49:27

+0

你确定要'MouseEvent.BUTTON3'吗?不是典型的“BUTTON2”右键单击? – MikeTheLiar 2012-07-12 13:50:13

回答

10
  1. 你不会得到来自contentPane子组件的点击。

    我认为你的问题是你已经添加了东西到你的面板。当用户点击子组件占用的区域时,该子组件获得点击事件。

    快速修复:我建议您为所有子组件添加相同的鼠标侦听器。

  2. 你是不是“点击”

    的点击当按下和释放鼠标真的很快的。如果你不小心,你可能会得到(例如)“按下,移动,释放”事件而不是“点击”事件。

    快速修复:改为使用mouseReleased事件。

+0

我相信就是这样,因为他确实提到他有* OpenMenu *组件。 Asker必须将他的mouselistener添加到**那个组件中。 – 2012-07-12 13:57:32

+0

嗡嗡声,我只看到一个面板和丢失的鼠标事件。在执行什么可能有些东西,但我认为我的答案仍然适用。 – dacwe 2012-07-12 14:03:37

+2

哇,谢谢!从来没有想过它。这是我的问题,当我移动一点它没有奏效。 – DanM 2012-07-12 14:05:06

0

使用此代码来代替:

private MouseAdapter listener = new MouseAdapter() { 

    public void mouseReleased(MouseEvent e) { 
     if (downer) { 
      downer = false; 
      if (new Rectangle(e.getComponent().getLocationOnScreen(), e.getComponent().getSize()) 
        .contains(e.getLocationOnScreen())) { 
       downer = false; 
       // CODE 
       new Thread(new Runnable(){ 
        public void run(){ 
         //Your Listener code 
        } 
       }).start(); 

       /// COde 
      } 
     } 
    } 

    boolean downer = false; 

    public void mousePressed(java.awt.event.MouseEvent e) { 
     downer = true; 
    } 
}; 

如果按组件和释放组件上此代码仅反应,并开始自定义任务一个新线程。这应该总是有效,因为AWT线程不会被长时间计算阻塞。