MouseListener延迟了一点mouseEntered

时间:2015-10-28 20:16:14

标签: java swing jlabel mouselistener

我有一个JLabel,我在其上使用了MouseListener。我使用已知的代码:

jl.addMouseListener(new MouseAdapter() {
    public void mouseEntered(MouseEvent me) {
        System.out.println("Entered")
    }
});

当我在Entered上输入鼠标时,会打印文本JLabel。一切都很好,但是当我在JLabel上输入光标然后打印要打印的文本时,我希望存在一些延迟(例如1-2秒)。我怎么能做到这一点?非常感谢

2 个答案:

答案 0 :(得分:2)

鉴于Swing API的单线程特性以及API不是线程安全的事实,我建议使用Swing Timer在事件和操作之间注入一小段延迟,示例...

Timer timer = new Timer(1000, new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent evt) {
        //...
    }
});
timer.setRepeats(false); // So you are notified only once per mouseEnter event

jl.addMouseListener(new MouseAdapter() {
    public void mouseEntered(MouseEvent me) {
        timer.restart();
    }
});

每次鼠标触发ActionListener事件时,此示例都会将mouseEntered的调用延迟1秒。但请注意,如果用户在延迟到期之前退出并输入标签,它将重置为开始。

如果您希望某个事件在任何mouseEnter事件后触发1秒,那么您只需在每个Timer事件上创建一个新的Swing mouseEnter

请查看Concurrency in SwingHow to use Swing Timers了解详情

答案 1 :(得分:1)

使用ScheduledExecutorService

在程序的某个地方,您需要创建一个:

final ScheduledExecutorService svc = Executors.newScheduledThreadPool(1);

然后在您的鼠标监听器中安排一项任务:

jl.addMouseListener(new MouseAdapter() {
    @Override
    public void mouseEntered(MouseEvent me) {
        svc.schedule(new Runnable() {
            @Override
            public void run() { System.out.println("Entered"); }
        }, 2, TimeUnit.SECONDS); 
    }
});

我会将一些功能分离到匿名内部类调用的方法中。嵌套这样的匿名内部类很快就会导致难以阅读和难以维护的代码。