4 Stimmen

Java Swing - Ereignis mouseMoved wird langsam ausgelöst

Derzeit habe ich Probleme mit dem Ereignis mouseMoved in Java - Swing. Kurz gesagt, ich habe ein JPanel und ich habe MouseMotionListener angehängt, um zu verbergen oder zeigen JscrollPane on the fly:

myPanel.addMouseMotionListener(new MousePresenter());

Ich habe meine eigene Klasse, die MouseMotionListener-Schnittstelle implementiert:

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();
   }

  }

} 

Das Problem ist, dass das Ereignis mouseMoved nicht oft genug ausgelöst wird. Gibt es eine verwandte Lösung für dieses Problem bei der Verwendung von MouseMotionListener?

Ich danke Ihnen für Ihre Zeit.

2voto

Robin Punkte 35393

Die folgende Methode scheint bei mir gut zu funktionieren. Beachten Sie, dass die Behandlung des Ereignisses ist ziemlich schnell:

  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 );
      }
    } );
  }

Das ist vielleicht nicht der Fall für Ihre hideScrollBar Methode

1voto

Jack Punkte 128223

Ein Mausbewegungsereignis ist von Natur aus langsam, da es bei jeder Pixeländerung ausgelöst wird.

Das Einzige, was Sie tun können, um die ganze Angelegenheit zu optimieren, ist zu optimieren, was Sie innerhalb des Callback-Handlers tun. In Ihrem Fall haben Sie

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

Das bedeutet, dass Sie in jedem Fall versuchen, die Bildlaufleiste ein- oder auszublenden, auch wenn sie bereits ein- oder ausgeblendet ist. Was Sie tun können, ist:

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

So dass Sie nur die Sichtbarkeit des Elements ändern (was eine schwere Operation sein kann, da es möglicherweise erforderlich ist, Dinge zu relaunchen), wenn Sie von innerhalb der Grenzen nach außerhalb und umgekehrt wechseln. Dies sollte die Rechenoperationen um einiges verringern.

1voto

lotophage Punkte 155

Wenn Ihr gesamter Code im Event Dispatch-Thread ausgeführt wird, könnte dies zu Problemen führen. Werfen Sie einen Blick auf diese Pfad und versuchen, jeden Code, der viel Arbeit macht, in eine SwingWorker Thema.

1voto

Dan D. Punkte 32096

Ihr Code ist nicht sehr gut optimiert. So wie er ist, wird er immer entweder die Methoden show oder hide Scrollbar aufrufen. Sie sollten ihn wahrscheinlich so ändern, dass er ihn nur ausblendet, wenn er sichtbar ist, und ihn nur anzeigt, wenn er versteckt ist.

0voto

Karel Burda Punkte 149

Problem gelöst. Es gab ein bestimmtes Leistungsproblem in meiner Anwendung, das solche Verzögerungen verursachte. Ich danke Ihnen für Ihre Bemühungen und die Informationen und Ratschläge, die Sie uns gegeben haben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X