当鼠标在JFrame内移动时,Swing Timer停止调用actionPerformed()

如果我在javax.swing.JFrame移动鼠标, javax.swing.Timer停止调用actionPerformed()方法,直到鼠标停止移动。 只有当我用我的Rocket Kone XTD鼠标移动光标时才会发生这种情况。 当我使用我的触控板时,一切都很好。

我该如何解决? 我正在使用macOS Sierra。

这是我的代码:

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

想知道我在说什么:

在此处输入图像描述

提供更多详细信息的代码:

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

输出:

如果鼠标没有移动,输出看起来像这样:11真13真13真10真12真13真12真13真10真。

当鼠标移动(快速)时,没有输出。 当鼠标停止移动时,输出为:2406为真(取决于我移动鼠标的时间长度)。

如果鼠标移动缓慢,输出看起来像这样:17真5真8真16真4真11真16真44真11真28真48真77真11真7真15真8真9真12真24真13真4真12真32真13真8真8真13真10真15真。

在此处输入图像描述

我解决了这个问题,因为我将鼠标的轮询率从1000Hz降低到500Hz。 现在一切都很完美。 我认为问题在于UI-Thread过度扩展,每秒处理1000个民意调查,因此忙于处理Timer