ventana una regresar otro otra ocultar llamar hacer esconder destruir desde cerrar abrir java swing timer mouse actionlistener

java - una - Swing Timer deja de llamar a actionPerformed() mientras el mouse se mueve dentro de un JFrame



ocultar una ventana java (1)

Resolví el problema porque reduje la velocidad de sondeo de mi mouse de 1000Hz a 500Hz. Ahora todo funciona perfecto. Creo que el problema fue que el UI-Thread estaba demasiado extendido manejando las 1000 encuestas por segundo, así que estaba ocupado para manejar el Timer .

Si muevo mi mouse dentro de javax.swing.JFrame , javax.swing.Timer deja de llamar al método actionPerformed() hasta que el mouse deje de moverse. Solo ocurre cuando muevo el cursor con mi mouse Rocket Kone XTD. Cuando uso mi trackpad todo está bien.

¿Cómo puedo arreglarlo? Estoy usando macOS Sierra.

Aquí está mi código:

import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JFrame; import javax.swing.Timer; public class Mouse { public static void main(String[] args) { JFrame frame = new JFrame(); frame.setSize(500, 500); frame.setVisible(true); Timer timer = new Timer(10, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.out.println("foo"); } }); timer.start(); } }

Para tener una idea de lo que estoy hablando:

Código que da más detalles:

import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Mouse { public static void main(String[] args) { // Note: Swing/AWT GUIs should be started on the EDT! // If the problem displayed here, that is first change I''d make to code. final JFrame frame = new JFrame(); frame.setSize(500, 500); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); Timer timer = new Timer(10, new ActionListener() { long lastTime = 0; @Override public void actionPerformed(ActionEvent e) { long nowTime = System.currentTimeMillis(); long difference = nowTime-lastTime; lastTime = nowTime; Rectangle r = frame.getBounds(); Point p = MouseInfo.getPointerInfo().getLocation(); System.out.println(String.format("%1s/t%2s", difference, r.contains(p))); } }); timer.start(); } }

Salida:

Si el mouse no se mueve, la salida se ve así: 11 verdadero 13 verdadero 13 verdadero 10 verdadero 12 verdadero 13 verdadero 12 verdadero 13 verdadero 10 verdadero.

Mientras el mouse se mueve (rápido), no hay salida. Cuando el mouse deja de moverse, la salida es: 2406 verdadero (dependiendo de cuánto tiempo moví mi mouse).

Si el mouse se mueve lentamente, la salida se ve así: 17 verdadero 5 verdadero 8 verdadero 16 verdadero 4 verdadero 11 verdadero 16 verdadero 44 verdadero 11 verdadero 28 verdadero 48 verdadero 77 verdadero 11 verdadero 7 verdadero 15 verdadero 8 verdadero 9 verdadero 12 verdadero 24 true 13 true 4 true 12 true 32 true 13 true 8 true 8 true 13 true 10 true 15 true.