2012-11-29 7 views
7

Ich baue eine Anwendung in JavaFx 2.2, die in einem Splitpanel mit einem Panel der Komponente auf der linken Seite und einem Arbeitsblatt auf der rechten Seite besteht. Grundsätzlich möchte ich einen einfachen WYSIWYG-Editor erstellen, bei dem Sie die Komponente von links nach rechts ziehen und dann auf der rechten Seite anordnen.Implementieren von Drag-and-Drop wie in Scene Builder

ich die letzten paar Tage verbracht haben versucht, die gleiche Drag-and-Drop-Funktion zu implementieren, die SceneBuilder hat, ohne Glück ..

Nach der Probe bei http://docs.oracle.com/javafx/2/drag_drop/HelloDragAndDrop.java.html ich habe es geschafft, eine Drag- zu bekommen and-drop working, aber ich kann keine Möglichkeit finden, das Standard-Dateisymbol zu ändern, das beim Ziehen angezeigt wird (und es durch einen Schnappschuss der zu ziehenden Komponente ersetzt) ​​und das verbotene Symbol zu zeigen, wenn du über etwas hinweg bist Du kannst nicht fallen gelassen werden.

Jede mögliche Hilfe würde (könnte Beratung, Code-Schnipsel, Muster oder anderes sein) sehr geschätzt :)

Dank!

Antwort

16

[UPDATE]

Schließlich gelang es mir:

/* The 'sceneRoot' object is the root Node of the scene graph 
* stage.setScene(new Scene(sceneRoot, 1280, 1024)); 
*/ 

private ImageView dragImageView = new ImageView(); 
private Node dragItem; 

_

rightPane.setOnMouseDragEntered(new EventHandler<MouseDragEvent>() { 
    public void handle(MouseDragEvent e) { 
     rightPane.setStyle("-fx-border-color:red;-fx-border-width:2;-fx-border-style:solid;"); 
     e.consume(); 
    } 
}); 
rightPane.setOnMouseDragExited(new EventHandler<MouseDragEvent>() { 
    public void handle(MouseDragEvent e) { 
     rightPane.setStyle("-fx-border-style:none;"); 
     e.consume(); 
    } 
}); 
rightPane.setOnMouseDragReleased(new EventHandler<MouseDragEvent>() { 
    public void handle(MouseDragEvent e) { 
     //TODO: add new instance of dragItem to rightPane 
     e.consume(); 
    } 
}); 

_

private void addGesture(final Node node) { 
    node.setOnDragDetected(new EventHandler<MouseEvent>() { 
     public void handle(MouseEvent e) { 

      SnapshotParameters snapParams = new SnapshotParameters(); 
      snapParams.setFill(Color.TRANSPARENT); 
      dragImageView.setImage(node.snapshot(snapParams, null)); 

      sceneRoot.getChildren().add(dragImageView); 

      dragImageView.startFullDrag(); 
      e.consume(); 
     } 
    }); 
    node.setOnMouseDragged(new EventHandler<MouseEvent>() { 
     public void handle(MouseEvent e) { 
      Point2D localPoint = sceneRoot.sceneToLocal(new Point2D(e.getSceneX(), e.getSceneY())); 
      dragImageView.relocate(
        (int)(localPoint.getX() - dragImageView.getBoundsInLocal().getWidth()/2), 
        (int)(localPoint.getY() - dragImageView.getBoundsInLocal().getHeight()/2) 
      ); 
      e.consume(); 
     } 
    }); 
    node.setOnMouseEntered(new EventHandler<MouseEvent>() { 
     public void handle(MouseEvent e) { 
      node.setCursor(Cursor.HAND); 
     } 
    }); 
    node.setOnMousePressed(new EventHandler<MouseEvent>() { 
     public void handle(MouseEvent e) { 
      dragItem = node; 
      dragImageView.setMouseTransparent(true); 
      node.setMouseTransparent(true); 
      node.setCursor(Cursor.CLOSED_HAND); 
     } 
    }); 
    node.setOnMouseReleased(new EventHandler<MouseEvent>() { 
     public void handle(MouseEvent e) { 
      dragItem = null; 
      dragImageView.setMouseTransparent(false); 
      node.setMouseTransparent(false); 
      node.setCursor(Cursor.DEFAULT); 
      sceneRoot.getChildren().remove(dragImageView); 
     } 
    }); 

} 
+1

Gute Arbeit. Die Funktion [Ziehen-Ansicht] (http://javafx-jira.kenai.com/browse/RT-14730?focusedCommentId=317064#) soll in einer zukünftigen Version, wahrscheinlich jdk8, zur JavaFX-Plattform hinzugefügt werden. – jewelsea

+0

Ich versuche, die Lösung für eine ListView neu zu implementieren, aber ich weiß nicht, welchen Typ die Szenenvariable im setOnDragDetected-Handler ist. Es ist keine Szene, da Scene die Methode Childer() nicht erhalten hat. – andreas

+0

Das Objekt 'Szene' ist eigentlich der Hauptknoten des Szenegraphs. Ich habe meinen Code mit Kommentaren aktualisiert und Szene von SceneRoot für besseres Verständnis umbenannt. Danke für die Hervorhebung das;) – Badisi

2

Vielleicht spät, aber mit der setDragView Option, ist jetzt mehr simple :)