Java przestaje przechwytywać zdarzenia ruchu myszy po zmaksymalizowaniu lub pełnym wyświetleniu okna w systemie Mac OS X

Kiedy powiększam okno, naciskając przycisk maksymalizacji lub przycisk pełnoekranowy na OS X, zdarzenia ruchu myszy nie są już przechwytywane (choć przeciąganie jest).

Poniżej zamieszczam program demonstracyjny, który podkreśla ten problem. Problem maksymalizacji można zreplikować za pomocąPrzykład uruchomienia myszy MouseEventDemo naStrona z samouczkami Java.

Po rozwiązaniu problemu zauważyłem, że ruchy myszy są ponownie przechwytywane, jeśli mysz opuszcza okno (np. Przesuwa się na górę okna, aby uzyskać dostęp do paska menu), a następnie powraca. Wydaje się, że problem może mieć związek z relacją między pozycją myszy a oknem podczas zmiany rozmiaru animacji, ponieważ mysz nie jest w ramce przed zmianą rozmiaru, ale jest później, chociaż niekoniecznie porusza się w procesie.

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();
        }
    }
}

Uruchomienie powyższego kodu powinno ujawnić, kiedy etykieta robi i nie aktualizuje.

Używam OS X w wersji 10.9 Build 13A3017 z Java SE 7 [1.7.0_45].

questionAnswers(4)

yourAnswerToTheQuestion