2016-11-28 54 views
3

我有一个非常昂贵的操作来做一个窗格上的鼠标滚动。我目前使用JavaFX滚动开始和结束

pane.setOnScroll({myMethod()}). 

问题是,如果你滚动很多,它会计算所有的东西很多次。所以我想要的只是当滚动完成时才会执行我的操作。我希望使用setOnScrollStarted,保存起始值和setOnScrollFinished来执行我的操作。

但我不知道为什么这两种方法都不会被调用。作为我使用的测试

pane.setOnScroll({System.out.println("proof of action"}); 

而且它显然从未被称为。

只有在滚动结束时如何调用我的方法的任何想法?

由于提前,甲

+1

在第三段不会编译的代码示例,你缺少一个右括号。 –

+0

滚动开始并且滚动完成不会被触发,因为只有在通过触摸手势执行滚动时才会触发滚动(与例如鼠标滚轮不同)。 – DVarga

回答

1

javadoc of ScrollEvent(重点煤矿):

当滚动由触摸手势产生的(如通过触摸屏拖动 手指)时,它被SCROLL_STARTED 和SCROLL_FINISHED事件包围。在滚动期间更改涉及的触摸点的数量 被视为新的手势,因此一对 SCROLL_FINISHED和SCROLL_STARTED通知每次发送 时间touchCount更改。 滚动是由滚轮旋转引起的,只有一次性SCROLL事件被传送,没有 开始/完成的环境。

可能的解决方法:每当检测到滚动时间

递增计数器变量。在侦听器中启动一个等待1秒的新线程,并且只有在计数器等于1(最后一次滚动)时才执行所需的操作,然后递减计数器。

public class Main extends Application { 
    private Integer scrollCounter = 0; 

    @Override 
    public void start(Stage primaryStage) { 
     try { 
      BorderPane root = new BorderPane(); 
      Scene scene = new Scene(root,400,400); 

      Pane pane = new Pane(); 
      pane.setOnScroll(e -> { 

       scrollCounter ++; 

       Thread th = new Thread(() -> { 
        try { 
         Thread.sleep(1000); 
         Platform.runLater(() -> { 
          if(scrollCounter == 1) 
           System.out.println("Scroll ended!"); 
          scrollCounter--; 
         }); 
        } catch (Exception e1) { 
         e1.printStackTrace(); 
        } 
       }); 
       th.setDaemon(true); 
       th.start(); 
      }); 

      root.setCenter(pane); 
      primaryStage.setScene(scene); 
      primaryStage.show(); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+0

好主意,你的伎俩做到了魅力!谢谢。 –