Java beendet die Erfassung von Mausbewegungsereignissen, nachdem ein Fenster in Mac OS X maximiert oder vollständig angezeigt wurde

Wenn ich ein Fenster durch Drücken der Maximieren-Taste oder der Vollbild-Taste unter OS X vergrößere, werden Mausbewegungsereignisse nicht mehr erfasst (obwohl Ziehen aktiviert ist).

Ich habe ein Demo-Programm darunter aufgenommen, das das Problem hervorhebt. Das Maximierungsproblem kann mithilfe von repliziert werdenBeispiel für den Webstart von MouseEventDemo auf derJava Tutorials-Website.

Nach einiger Fehlerbehebung habe ich festgestellt, dass die Mausbewegungen wieder aufgenommen werden, wenn die Maus das Fenster verlässt (z. B. zum oberen Rand des Fensters bewegt wird, um auf die Menüleiste zuzugreifen) und dann zurückkehrt. Es scheint, dass das Problem mit der Beziehung zwischen der Mausposition und dem Fenster während der Größenänderung von Animationen zu tun hat, da sich die Maus vor der Größenänderung nicht im Frame befindet, sondern danach, obwohl sie sich nicht notwendigerweise bewegt hat.

import java.awt.Window;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.lang.reflect.Method;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Main implements MouseMotionListener {

    JLabel label = new JLabel("label");

    public static void main(String[] args) {
        Main main = new Main();
        main.init();
    }

    public void init() {
        JFrame frame = new JFrame();
        frame.setSize(640, 480);
        frame.setLocationRelativeTo(null);
        frame.getContentPane().add(label);
        frame.addMouseMotionListener(this);
        frame.setVisible(true);

        if (isMacOSX()) {
            enableFullScreenMode(frame);
        }
    }

    public void mouseDragged(MouseEvent e) {
        label.setText(e.toString());
    }

    public void mouseMoved(MouseEvent e) {
        label.setText(e.toString());
    }

    private static boolean isMacOSX() {
        return System.getProperty("os.name").indexOf("Mac OS X") >= 0;
    }

    public static void enableFullScreenMode(Window window) {
        try {
            Class<?> clazz = Class.forName("com.apple.eawt.FullScreenUtilities");
            Method method = clazz.getMethod("setWindowCanFullScreen", new Class<?>[] { Window.class, boolean.class });
            method.invoke(null, window, true);
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }
}

Wenn Sie den obigen Code ausführen, sollte sich herausstellen, wann die Beschriftung aktualisiert wird und wann nicht.

Ich verwende OS X Version 10.9 Build 13A3017 mit Java SE 7 [1.7.0_45].

Antworten auf die Frage(4)

Ihre Antwort auf die Frage