4

目前我在 Java - Swing 中遇到了 mouseMoved 事件的问题。简而言之,我有一个 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 时是否有任何相关的解决方案来解决这个问题?

感谢您的时间。

4

5 回答 5

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您的方法可能不是这种情况

于 2012-09-27T10:02:07.807 回答
1

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

要优化整个问题,您唯一能做的就是优化您在回调处理程序中所做的事情。在你的情况下,你确实有

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

这意味着在任何情况下,您都试图显示或隐藏滚动条,即使它已经显示或隐藏。你可以做的是:

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

这样您就可以在从边界内部切换到外部时修改元素的可见性(这可能是一项繁重的操作,因为它可能需要重新布局事物),反之亦然。这应该会大大降低计算操作。

于 2012-09-27T09:55:53.457 回答
1

如果您的所有代码都在 Event Dispatch 线程中执行,则可能会导致问题。看看这条线索,并尝试将任何做大量工作的代码放在SwingWorker线程中。

于 2012-09-27T09:56:10.303 回答
1

您的代码没有得到很好的优化。事实上,它总是会调用 show 或 hide Scrollbar 方法。您可能应该修改它,例如仅在可见时将其隐藏,仅在隐藏时才显示。

于 2012-09-27T09:56:21.407 回答
0

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

于 2012-09-27T11:50:41.470 回答