Java pára de capturar eventos de movimento do mouse após maximizar ou rastrear completamente uma janela no Mac OS X
Quando amplio uma janela pressionando o botão de maximização ou o botão de tela cheia no OS X, os eventos de movimento do mouse não são mais capturados (embora o arrastamento seja).
Eu incluí um programa de demonstração abaixo que destaca o problema. O problema de maximização pode ser replicado usando oExemplo de início da web MouseEventDemo noWebsite de Tutoriais Java.
Após alguns problemas, observei que os movimentos do mouse são recapturados se o mouse sair da janela (por exemplo, passa para a parte superior da janela para acessar a barra de menus) e depois retorna. Parece que o problema pode ter algo a ver com a relação entre a posição do mouse e a janela durante o redimensionamento de animações, já que o mouse não está no quadro antes do redimensionamento, mas depois, embora não tenha necessariamente se movido no processo.
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();
}
}
}
Executar o código acima deve revelar quando o rótulo é atualizado ou não.
Estou executando o OS X versão 10.9 Build 13A3017 com o Java SE 7 [1.7.0_45].