2016-07-21 10 views
0

誰かが、イメージビューをペイン(JavaFX)上にドラッグするためのEventHandlerの設定方法の簡単な例を挙げることができます。ドラッグするには、イメージ上でマウスを押し、ドラッグしてイメージをフォローしてからマウスを離すとイメージビューがその位置で停止します。JavaFX:ペイン上でimageviewをドラッグする方法

+0

の可能性のある重複[JavaFXの2にドラッグすることによって、ノードを移動する正しい方法?]( http://stackoverflow.com/questions/10682107/correct-way-to-move-a-node-by-dragging-in-javafx-2)。より洗練されたもの(および複雑なもの)については、[Oracle JavaFXサンプルペーパードールアプリケーション](https://docs.oracle.com/javase/8/javafx/events-tutorial/paper-doll.htm)を参照してください。 )。 – jewelsea

答えて

1

は最初Drag and drop in javafx たり、getMouseXgetMouseYポイントでそれを自分で行うとAnchorPaneでImageViewの座標を変更することができますドキュメントを読んで....

0

私はドラッグ&ドロップで提案された解決策を試してみたかったです。私はそれが最適ではないことがわかります。ドラッグでそれを行うことにより

、あなたが不要ないくつかのメカニズムをトリガードロップ:

  • あなたは私も問題ことがあった
  • カーソルが変化...
  • アプリケーションの外にドラッグすることができます位置デルタのカリキュレーションはスピードに依存しているようです

ネザーレス、興味がある場合はこれが私のコードです:

Main.java

package sample; 

import javafx.application.Application; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.stage.Stage; 

public class Main extends Application { 

    @Override 
    public void start(Stage primaryStage) throws Exception{ 
     FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml")); 

     Controller controller = new Controller(); 
     loader.setController(controller); 

     Parent root = (Parent)loader.load(); 
     controller.InitUi(); 

     primaryStage.setTitle("Hello World"); 
     primaryStage.setScene(new Scene(root, 300, 275)); 
     primaryStage.show(); 
    } 


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

Controller.java

package sample; 

import javafx.event.EventHandler; 
import javafx.fxml.FXML; 
import javafx.scene.input.*; 
import javafx.scene.layout.AnchorPane; 
import javafx.scene.shape.Rectangle; 

public class Controller 
{ 
    @FXML 
    private Rectangle draggable; 

    private Double lastX = null; 
    private Double lastY = null; 

    public void InitUi() 
    { 
     if (this.draggable != null) 
     { 
      this.draggable.setOnDragOver(new EventHandler<DragEvent>() 
      { 
       @Override 
       public void handle(DragEvent dragEvent) 
       { 
        HandleMouseMovement(dragEvent.getSceneX(), dragEvent.getSceneY()); 
       } 
      }); 

      this.draggable.setOnDragDetected(new EventHandler<MouseEvent>() { 
       public void handle(MouseEvent event) { 
        Dragboard db = draggable.startDragAndDrop(TransferMode.ANY); 
        ClipboardContent content = new ClipboardContent(); 
        content.putString("Does not matter"); 
        db.setContent(content); 
        event.consume(); 

        lastX = event.getSceneX(); 
        lastY = event.getSceneY(); 
       } 
      }); 
     } 
    } 

    private synchronized void HandleMouseMovement(double sceneX, double sceneY) 
    { 
     double deltaX = sceneX - lastX; 
     double deltaY = sceneY - lastY; 

     lastX = sceneX; 
     lastY = sceneY; 

     double currentXAnchor =AnchorPane.getLeftAnchor(this.draggable); 
     double currentYAnchor =AnchorPane.getTopAnchor(this.draggable); 

     AnchorPane.setLeftAnchor(this.draggable, currentXAnchor + deltaX*1.5); 
     AnchorPane.setTopAnchor(this.draggable, currentYAnchor + deltaY*1.5); 
    } 
} 

sample.fxml

<?import javafx.scene.layout.GridPane?> 

<?import javafx.scene.layout.AnchorPane?> 
<?import javafx.scene.shape.Rectangle?> 
<GridPane xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10" prefHeight="500" prefWidth="500"> 
    <AnchorPane> 
     <Rectangle fx:id="draggable" width="40" height="50" AnchorPane.topAnchor="20" AnchorPane.leftAnchor="20"/> 
    </AnchorPane> 
</GridPane> 
+0

それでは、スピードの問題は、同時にハンドデルを使った複数の移動イベントと関係していたようです。 'HandleMouseMovement'を' synchroized'にすると、その問題が解決されました。 (ほとんどの場合) – FrankT

関連する問題