Java Swing - mouseMoved事件被慢慢触发

时间:2012-09-27 09:49:43

标签: java swing mouse

目前我在Java中遇到了mouseMoved事件的问题 - Swing。简而言之,我有一个JPanel,我已经将MouseMotionListener附加到它上面,以便隐藏或显示JscrollPane:

myPanel.addMouseMotionListener(new MousePresenter());

我有自己的类实现了MouseMotionListener接口:

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

  }

} 

问题是mouseMoved事件没有经常被触发。使用MouseMotionListener时,是否有任何相关的解决方案?

感谢您的时间。

5 个答案:

答案 0 :(得分:2)

以下似乎对我来说效果很好。请注意,事件的处理速度相当快:

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

您的hideScrollBar方法可能不是这种情况

答案 1 :(得分:1)

鼠标移动事件本质上很慢,因为它会在每次像素更改时触发。

优化整个问题的唯一方法是优化您在回调处理程序中执行的操作。在你的情况下,你有

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

这意味着在任何情况下,即使已经显示或隐藏滚动条,您也要尝试显示或隐藏滚动条。你能做的是:

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

因此,当您从边界内部切换到外部时,您只能修改元素的可见性(这可能是一个繁重的操作,因为它可能需要重新布局)。这应该会大大降低计算操作。

答案 2 :(得分:1)

如果您在Event Dispatch线程中执行了所有代码,则可能会导致问题。看看这个trail并尝试在SwingWorker线程中放置任何可以完成大量工作的代码。

答案 3 :(得分:1)

您的代码未得到很好的优化。实际上,它总是调用show或hide Scrollbar方法。您应该修改它,例如它仅在可见时隐藏它,并且仅在隐藏时显示它。

答案 4 :(得分:0)

问题解决了。我的应用中存在某些导致此类延迟的性能问题。 感谢您的努力以及您提供的信息和建议。