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

时间:2016-11-15 22:25:30

标签: java swing timer mouse actionlistener

如果我将鼠标移到Task.Run(() => { using(var ms = new MemoryStream()) { /* capture ms and process the stream */ } } 内,javax.swing.JFrame会停止调用javax.swing.Timer方法,直到鼠标停止移动。只有当我用我的Rocket Kone XTD鼠标移动光标时才会发生这种情况。当我使用我的触控板时,一切都很好。

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

这是我的代码:

actionPerformed()

想知道我在说什么:

enter image description here

提供更多细节的代码:

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

输出:

如果鼠标没有移动,输出看起来像这样: 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是的。

enter image description here

1 个答案:

答案 0 :(得分:0)

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