2017-01-19 3 views
0

私はJavaFXを使い慣れていないので、ユーザーが自分のOSのようにアプリケーションの外からファイルをドラッグしているときにマウスの位置を検出する必要があります。ウィンドウからドラッグしてフォーカスを要求する

EventHandler<MouseEvent> mouseMoved = new EventHandler<MouseEvent>() { 

    @Override 
    public void handle(MouseEvent event) { 
     logger.severe(event.getScreenX() + " : " + event.getScreenY()); 
    } 
}; 

scrollPane.setOnDragEntered(new EventHandler<DragEvent>() { 

    @Override 
    public void handle(DragEvent event) { 
     scrollPane.getScene().getWindow().requestFocus(); 
     scrollPane.requestFocus(); 
     event.consume(); 
     isDragging = true; 
     logger.severe(event.getScreenX() + " : " + event.getScreenY()); 
     scrollPane.addEventHandler(MouseEvent.MOUSE_MOVED, mouseMoved); 
    } 
}); 

scrollPane.setOnDragExited(new EventHandler<Event>() { 
    @Override 
    public void handle(Event event) { 
     isDragging = false; 
     event.consume(); 
     scrollPane.removeEventHandler(MouseEvent.MOUSE_MOVED, mouseMoved); 
    } 
}); 

scrollPane.setOnDragDropped(new EventHandler<Event>() { 
    @Override 
    public void handle(Event event) { 
     isDragging = false; 
     event.consume(); 
     scrollPane.removeEventHandler(MouseEvent.MOUSE_MOVED, mouseMoved); 
    } 
}); 

に成功し、ユーザーが何かをドラッグし、私の見解に入ったことを検出したが、ユーザが自分のアプリケーションの外をクリックするので、私のノードがフォーカスを持っていると私ない:私はこのように、dragEnteredとdragExitedのリスナーを追加しましたフォーカスはOS上にあるのでrequestFocusもできません - マウス移動を検出するためにscrollPaneノードにMouseEventHandlerを追加できません。スマートなスクロールを実装するにはこれが必要です。ユーザーがScrollPaneをドラッグすると、ノードの下端でマウスを動かすことができ、スクロールがスムーズに行われます。

誰かがこの問題を私に助けてくれますか?例えば

+1

これはテストされていませんが、まずウィンドウのフォーカスを要求するのに役立ちます。つまり、scrollPane.requestFocus()を呼び出す前に 'scrollPane.getScene()。getWindow()。requestFocus()'を実行しますか? –

+0

ありがとうございます。これは実際に自分のアプリケーション(私のタスクバーに表示される)にフォーカスを変更しますが、それでもMOUSE_MOVEDのイベントハンドラは機能しません。 – Robert

答えて

0

私は@James_Dから受け取った助けを借りて、私はsetOnDragOverを使用して、任意の動きでマウスの位置を得ることができました。

scrollPane.setOnDragEntered(new EventHandler<DragEvent>() { 

    @Override 
    public void handle(DragEvent event) { 
    scrollPane.getScene().getWindow().requestFocus(); 
    scrollPane.requestFocus(); 
    event.consume(); 
    isDragging = true; 

    } 
}); 

scrollPane.setOnDragOver(new EventHandler<DragEvent>() { 

    @Override 
    public void handle(DragEvent event) { 
    double windowHeight = scrollPane.getHeight(); 
    double topBar = (20*windowHeight)/100; 
    double bottomBar = windowHeight - topBar; 
    event.acceptTransferModes(TransferMode.LINK); 
    if(event.getY() > 0 && event.getY() < topBar && scrollPane.getVvalue() > 0) 
    scrollPane.setVvalue(scrollPane.getVvalue()-0.001); 
    else if(event.getY() < windowHeight && event.getY() > bottomBar && scrollPane.getVvalue() < 1) 
    scrollPane.setVvalue(scrollPane.getVvalue()+0.001); 
    } 

}); 

scrollPane.setOnDragExited(new EventHandler<Event>() { 
    @Override 
    public void handle(Event event) { 
    isDragging = false; 
    event.consume(); 
    } 
}); 

scrollPane.setOnDragDropped(new EventHandler<Event>() { 
    @Override 
    public void handle(Event event) { 
    isDragging = false; 
    event.consume(); 
    } 
}); 

そして上のアプリケーションの中にあなたが(たとえば)OSからファイルをドラッグすることを意味し、ドラッグしながらこれは、スマートスクロールを提供しています。誰もが同じ問題を抱えている場合は、ここに私のコードは、今どのように見えるかですscrollPane、上記のscrollPaneの下20%にマウスを移動すると、スクロールペインの上20%にマウスを移動するとゆっくりと下にスクロールし、上にスクロールします。

ご協力いただきありがとうございます。他にもご意見がございましたら、お読みください。

0

利用DragEventです代わりのイベント、:

scrollPane.setOnDragExited(new EventHandler<Event>() { 
     @Override 
     public void handle(Event event) { 
      event.consume(); 
      event.getScreenX(); // To get x position 
      event.getScreenY(); // To get y position 
      mouseOnTemplateBasker = false; 
      logger.severe("Exited dragging something"); 

     } 
    }); 
+0

あなたの答えをありがとう。実際、私はマウスのX/Y位置を得ることができますが、彼が私の視界から離れるときだけです。ユーザーがマウスを動かしているときに - 私のscrollPane上でドラッグしながら - 私はいくつかのeventHandlerが必要です。 – Robert

関連する問題