MouseListener 延迟一点 mouseEntered
MouseListener delay a bit mouseEntered
我有一个 JLabel
,我在上面使用了一个 MouseListener
。我使用已知代码:
jl.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent me) {
System.out.println("Entered")
}
});
当我在 JLabel
上输入鼠标时,会打印文本 Entered
。一切都很好,但我希望在我将光标输入 JLabel
然后输入要打印的文本时存在一点延迟(例如 1-2 秒)。我怎样才能做到这一点?非常感谢
您需要在程序的某处创建一个:
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);
}
});
我会将一些功能分离到由匿名内部 类 调用的方法中。像这样嵌套匿名内部 类 会很快导致代码难以阅读和维护。
鉴于 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();
}
});
此示例会在鼠标每次触发 mouseEntered
事件时将 ActionListener
的调用延迟 1 秒。但请注意,如果用户在延迟到期之前退出并进入标签,它将被重置回开始。
如果您希望某个事件在任何 mouseEnter
事件后 1 秒触发,那么您可以简单地在每个 mouseEnter
事件上创建一个新的 Swing Timer
。
查看 Concurrency in Swing and How to use Swing Timers 了解更多详情
我有一个 JLabel
,我在上面使用了一个 MouseListener
。我使用已知代码:
jl.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent me) {
System.out.println("Entered")
}
});
当我在 JLabel
上输入鼠标时,会打印文本 Entered
。一切都很好,但我希望在我将光标输入 JLabel
然后输入要打印的文本时存在一点延迟(例如 1-2 秒)。我怎样才能做到这一点?非常感谢
您需要在程序的某处创建一个:
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);
}
});
我会将一些功能分离到由匿名内部 类 调用的方法中。像这样嵌套匿名内部 类 会很快导致代码难以阅读和维护。
鉴于 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();
}
});
此示例会在鼠标每次触发 mouseEntered
事件时将 ActionListener
的调用延迟 1 秒。但请注意,如果用户在延迟到期之前退出并进入标签,它将被重置回开始。
如果您希望某个事件在任何 mouseEnter
事件后 1 秒触发,那么您可以简单地在每个 mouseEnter
事件上创建一个新的 Swing Timer
。
查看 Concurrency in Swing and How to use Swing Timers 了解更多详情