How can I delay a MouseOver in Java?

2019-01-26 01:53发布

I've got a short question and I hope somebody can help me.

Please look at the following code snippet:

public void mouseEntered(MouseEvent e){
   //wait 2 seconds.
   //if no other mouseEntered-event occurs, execute the following line
   //otherwise restart, counting the 2 seconds.
   foo();
}

Can somebody help me with that problem? I want to realize a behavior like an ToolTip: you enter a region with your mouse. If your mouse stays in that position, do something.

2条回答
Ridiculous、
2楼-- · 2019-01-26 02:16

Start a Timer with a delay of 2 seconds in your mouseEntered() method that calls whatever it is you want to do.

Set up a new handler (mouseExited()) that stops the timer if it hasn't gone off.

Basically, you know the mouse is still there if mouseExited() hasn't been called. The timer will either go off in two seconds doing what you want or be cancelled if the mouse exits.

查看更多
不美不萌又怎样
3楼-- · 2019-01-26 02:20

Although the answer provided by @Brian Roach is correct, there is yet another (and more succinct) way of achieving this. That is, using the ToolTipManager.

Example:

import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.ToolTipManager;

public final class ToolTipDemo {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run() {
                ToolTipManager.sharedInstance().setInitialDelay(2000);
                createAndShowGUI();
            }
        });
    }

    private static void createAndShowGUI(){
        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new FlowLayout());
        frame.add(new JToolTipButton());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private static final class JToolTipButton extends JButton{
        private static final long serialVersionUID = -5193366265809801639L;

        protected JToolTipButton(){
            super("I can haz tooltip?");
            setToolTipText("Hey man, get off me!");
        }
    }

}

By invoking setInitialDelay, I've changed the time the manager waits to display the tool tip from 750ms to 2000ms.

Note - Although I'm not sure, I think this may change the delay for ALL components (guess I was right), which may not be what you want..but it's still worth mentioning.

查看更多
登录 后发表回答