0

mouseListeners を使用する 2 つのコンポーネントを含むプログラムを作成しました。

  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

エラーの原因を取得しました。仮想マシン (VMWARE) で OSX を実行し、マウスの互換性オプションをチェックすると、MouseClicked イベントで問題が発生しました。ご迷惑おかけして申し訳ありません。

于 2012-04-25T19:30:56.937 に答える
0

OS X で JDK1.7 を使用して次のコードを試してみましたが、アイコンをクリックしてリスナーをトリガーできます。状況に合わせてこのコードを自由に変更して、問題を再現し、質問に含めることができます。

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 に答える