0

我编写了一个程序,其中包含两个使用 mouseListeners 的组件:

  1. ResizeRectangle 绘制一个带有手柄的矩形,并允许移动和调整矩形的大小。它处理 MouseEvents 和 MouseMotionEvents(MouseMove、MousePressed、MouseDragged 和 MouseReleased)。
  2. IconGrid 在矩形内绘制图标网格,并允许选择(单击)图标。它为此处理 MouseClicked 事件。

在 Windows 下一切正常。我今天尝试将程序移植到 Mac,但是 MouseClicked 事件永远不会被触发。我将 MouseClicked 事件放在 ResizeRectangle 中,但它也不会被触发。我将 MouseReleased 事件放在 IconGrid 中,它确实被解雇了。所以问题似乎真的出在 mouseClicked 事件上。

我阅读了另一篇文章,该文章指出,在 Mac 上,即使鼠标按下和鼠标释放之间的微小像素变化也会导致 MouseClicked 不会被触发。但即使我在空中用鼠标单击(因此没有机会在按下和释放之间移动鼠标),mouseClicked 事件也不会被触发。

还有其他人有这个问题吗?这是Mac上的错误吗?

4

2 回答 2

0

我在带有 JDK1.7 的 OS X 上尝试了以下代码,我可以单击图标并触发侦听器。请随意修改此代码以匹配您的情况,以便我们重现该问题并将其包含在您的问题中。

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.net.URL;

public class MouseClickedIcon {

  public static void showUI() throws IOException {
    JFrame testFrame = new JFrame( "TestFrame" );

    String imageSource = "http://www.mynewitguys.com/wp-content/uploads/2011/04/java1.png";

    ImageIcon icon = new ImageIcon( ImageIO.read( new URL( imageSource ) ) );
    JLabel label = new JLabel( icon );
    label.addMouseListener( new MouseAdapter() {
      @Override
      public void mouseClicked( MouseEvent e ) {
        System.out.println( "MouseClickedIcon.mouseClicked" );
      }
    } );
    testFrame.add( label, BorderLayout.CENTER );
    testFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    testFrame.pack();
    testFrame.setVisible( true );
  }

  public static void main( String[] args ) {
    EventQueue.invokeLater( new Runnable() {
      @Override
      public void run() {
        try {
          showUI();
        } catch ( IOException e ) {
        }
      }
    } );
  }
}
于 2012-04-21T19:18:12.740 回答
0

得到了错误的根源。我在虚拟机 (VMWARE) 中运行 OSX 并检查了鼠标兼容性选项,这导致了 MouseClicked 事件的问题。抱歉,添麻烦了。

于 2012-04-25T19:30:56.937 回答