2016-11-28 10 views
3

ペインのマウススクロールには非常にコストが掛かります。私は現在使用していますJavaFXのスクロールが開始され、終了しました

pane.setOnScroll({myMethod()}). 

問題は、多くをスクロールすると何度も何度も計算するということです。だから私が望むのは、スクロールが終了したときにだけ私の行動をすることです。 setOnScrollStartedを使用し、開始値を保存し、私の行動を行うためにsetOnScrollFinishedを使用したいと考えました。

しかし、私はこれらの2つのメソッドが呼び出されない理由はわかりません。私が使用したテストとして

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

これは明らかに呼び出されませんでした。

私のメソッドをスクロールの最後で呼び出す方法については、何か考えてください。予め

おかげで、javadoc of ScrollEvent(強調鉱山)から

+1

3番目の段落のコードサンプルはコンパイルされず、閉じ括弧がありません。 –

+0

スクロールが開始され、スクロールが終了したのは、スクロールがタッチジェスチャ(マウスホイールなどではない)によって実行されたときにのみ開始されるためです。 – DVarga

答えて

1

スクロールが(例えば、タッチスクリーン上 指をドラッグするなど)タッチジェスチャによって生成され、それSCROLL_STARTED とSCROLL_FINISHEDイベントで囲まれています。スクロール中に に関与するタッチポイントの数を変更することは新しいジェスチャーとみなされるため、 SCROLL_FINISHEDとSCROLL_STARTEDの通知のペアが届きます。 touchCountが変更されます。 ホイールの回転によってスクロールが発生した場合は、 の開始/終了の周りを使わずに、1回の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

良いアイデアは、あなたのトリックは魅力をした!ありがとう。 –

関連する問題