Java 鼠标听器延迟了一点鼠标听器

Java 鼠标听器延迟了一点鼠标听器,java,swing,jlabel,mouselistener,Java,Swing,Jlabel,Mouselistener,我有一个JLabel,我在上面用了一个MouseListener。我使用已知代码: jl.addMouseListener(new MouseAdapter() { public void mouseEntered(MouseEvent me) { System.out.println("Entered") } }); 当我在JLabel上输入鼠标时,将打印输入的文本。一切正常,但我希望在将光标输入JLabel然后输入要打印的文本时存在一点延迟(如1-2秒)。我

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

jl.addMouseListener(new MouseAdapter() {
    public void mouseEntered(MouseEvent me) {
        System.out.println("Entered")
    }
});
当我在
JLabel
上输入鼠标时,将打印输入的文本
。一切正常,但我希望在将光标输入
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); 
    }
});
我将把一些功能分离到由匿名内部类调用的方法中。像这样嵌套匿名内部类会很快导致代码难以读取和维护。

使用

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

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); 
    }
});
我将把一些功能分离到由匿名内部类调用的方法中。像这样嵌套匿名内部类会很快导致代码难以读取和维护。

使用

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

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); 
    }
});
我将把一些功能分离到由匿名内部类调用的方法中。像这样嵌套匿名内部类会很快导致代码难以读取和维护。

使用

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

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 = 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
计时器即可


查看并了解更多详细信息

鉴于Swing API的单线程性质以及API不是线程安全的事实,我建议使用Swing
计时器
在事件和操作之间注入一个小的延迟,例如

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
计时器即可


查看并了解更多详细信息

鉴于Swing API的单线程性质以及API不是线程安全的事实,我建议使用Swing
计时器
在事件和操作之间注入一个小的延迟,例如

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
计时器即可


查看并了解更多详细信息

鉴于Swing API的单线程性质以及API不是线程安全的事实,我建议使用Swing
计时器
在事件和操作之间注入一个小的延迟,例如

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
计时器即可


查看并获取更多详细信息

您可以使用javax.swing.Timer。有关如何使用它的示例,请参见鼠标进入标签时为什么要显示文本?解决方案将取决于MouseListener中要执行的代码。您可以使用javax.swing.Timer来执行可能重复的代码。有关如何使用它的示例,请参见鼠标进入标签时为什么要显示文本?解决方案将取决于MouseListener中要执行的代码。您可以使用javax.swing.Timer来执行可能重复的代码。有关如何使用它的示例,请参见鼠标进入标签时为什么要显示文本?解决方案将取决于MouseListener中要执行的代码。您可以使用javax.swing.Timer来执行可能重复的代码。有关如何使用它的示例,请参见鼠标进入标签时为什么要显示文本?解决方案将取决于MouseListener中要执行的代码。