Karel Burda
Karel Burda

Reputation: 149

Java Swing - mouseMoved event is fired slowly

Currently I am experiencing issues with the mouseMoved event in Java - Swing. Briefly, I have got a JPanel and I have attached MouseMotionListener to it, in order to hide or show JscrollPane on the fly:

myPanel.addMouseMotionListener(new MousePresenter());

I have got my own class that implements MouseMotionListener interface:

public class MousePresenter implements MouseMotionListener { 

  public void mouseMoved(MouseEvent e) {
   int x = e.getX();
   int y = e.getY();

   if (x>20 && x<200) {
    hideScrollBar();
   }
   else {
    showScrollBar();
   }

  }

} 

The issue is that the mouseMoved event is not being fired often enough. Is there any related solution to this issue whilst using MouseMotionListener?

Thank you for your time.

Upvotes: 4

Views: 1989

Answers (5)

Karel Burda
Karel Burda

Reputation: 149

Problem solved. There was certain performance issue in my app that caused such delays. Thank you for your effort and piece of information and advice you provided.

Upvotes: 0

Robin
Robin

Reputation: 36621

The following seems to work just fine for me. Note that the handling of the event is rather fast:

  public static void main( String[] args ) {
    EventQueue.invokeLater( new Runnable() {
      @Override
      public void run() {
        JFrame frame = new JFrame( "TestFrame" );
        JPanel content = new JPanel( new BorderLayout() );

        final JLabel mousePosition = new JLabel( "Unknown" );
        content.add( mousePosition, BorderLayout.NORTH );

        content.addMouseMotionListener( new MouseMotionAdapter() {
          @Override
          public void mouseMoved( MouseEvent e ) {
            mousePosition.setText( "X: " + e.getX() + " Y: " + e.getY() );
          }
        } );
        frame.setContentPane( content );
        frame.setDefaultCloseOperation( WindowConstants.EXIT_ON_CLOSE );
        frame.pack();
        frame.setVisible( true );
      }
    } );
  }

That might not be the case for your hideScrollBar method

Upvotes: 2

Dan D.
Dan D.

Reputation: 32391

Your code is not very well optimized. As it is, it will always call either the show or hide Scrollbar methods. You should probably modify it such as it hides it only if visible and it displays it only if hidden.

Upvotes: 1

lotophage
lotophage

Reputation: 163

If you all your code is being executed in the Event Dispatch thread it could be causing problems. Have a look at this trail and try to put any code that does a lot of work in a SwingWorker thread.

Upvotes: 1

Jack
Jack

Reputation: 133649

A mouse moved event is inherently slowly since it's fired on every pixel change.

The only thing you can do to optimize the whole issue is to optimize what you do inside the callback handler. In your case you do have

if (something)
  doA();
else
  doB();

This means that in any case you are either trying to show or to hide the scrollbar even when it's already shown or hidden. What you can do is:

if (scrollBarIsVisible && x>20 && x<200) {
  hideScrollBar();
  scrollBarIsVisible = false;
}
else if (!scrollBarIsVisible) {
  showScrollBar();
  scrollBarIsVisible = true;
}

So that you only modify the visibility of the element (which can be a heavy operation since it may require to relayout things) when switching from inside the bounds to outside and viceversa. This should lower the computational operations by a lot.

Upvotes: 1

Related Questions