首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java Swing - mouseMoved事件触发缓慢

Java Swing - mouseMoved事件触发缓慢
EN

Stack Overflow用户
提问于 2012-09-27 17:49:43
回答 5查看 1.8K关注 0票数 4

目前,我遇到了Java - Swing中mouseMoved事件的问题。简单地说,我有一个JPanel,并且我将MouseMotionListener附加到它,以便在运行时隐藏或显示JscrollPane:

代码语言:javascript
运行
复制
myPanel.addMouseMotionListener(new MousePresenter());

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

代码语言:javascript
运行
复制
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时,有没有相关的解决方案?

谢谢您抽时间见我。

EN

回答 5

Stack Overflow用户

发布于 2012-09-27 18:02:08

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

代码语言:javascript
运行
复制
  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方法,情况可能并非如此

票数 2
EN

Stack Overflow用户

发布于 2012-09-27 17:55:53

鼠标移动事件天生就很慢,因为它在每个像素变化时都会触发。

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

代码语言:javascript
运行
复制
if (something)
  doA();
else
  doB();

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

代码语言:javascript
运行
复制
if (scrollBarIsVisible && x>20 && x<200) {
  hideScrollBar();
  scrollBarIsVisible = false;
}
else if (!scrollBarIsVisible) {
  showScrollBar();
  scrollBarIsVisible = true;
}

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

票数 1
EN

Stack Overflow用户

发布于 2012-09-27 17:56:10

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12618594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档