2017-08-13 1 views
0

Ich habe einen Bereich (1440x800) und einen Knoten (400x300), die ich innerhalb dieses Bereichs verschieben muss. Für Pane habe ich StackPane genommen und für Node habe ich VBox genommen.Was ist der optimale Weg um absolut positionierten Knoten in JavaFX zu verschieben?

Dies ist der Controller, der den Knoten verschiebt.

public class Controller extends AbstractController { 

    /** 
    * Mouse pressed X position. 
    */ 
    private double mousePressedX; 

    /** 
    * Mouse pressed Y position. 
    */ 
    private double mousePressedY; 

    /** 
    * Insets that were when user pressed mouse. 
    */ 
    private Insets mousePressedInsets; 

    /** 
    * Mouse pressed handler. 
    * @param event 
    */ 
    @FXML 
    public void handleTitlePaneMousePressed(final MouseEvent event) { 
     Node node = (Node) getView().getFxView(); 
     mousePressedX = event.getScreenX(); 
     mousePressedY = event.getScreenY(); 
     mousePressedInsets = StackPane.getMargin(node); 
     if (mousePressedInsets == null) { 
      mousePressedInsets = new Insets(0, 0, 0, 0); 
     } 
    } 

    /** 
    * Moused dragged handler. 
    * @param event 
    */ 
    @FXML 
    public void handleTitlePaneMouseDragged(final MouseEvent event) { 
     Node node = (Node) getView().getFxView(); 
     double deltaX = event.getScreenX() - mousePressedX; 
     double deltaY = event.getScreenY() - mousePressedY; 
     Insets newInsets = 
       new Insets(mousePressedInsets.getTop() + deltaY, 0, 0, mousePressedInsets.getLeft() + deltaX); 
     StackPane.setMargin(node, newInsets); 
    } 
} 

Wenn Benutzer klickt auf den Titel des Knotens gedrückt dann X und Y werden gespeichert und in Moused dragged handler verwendet. Der Code funktioniert so, wie ich es brauche. Das einzige Problem ist, dass zwischen Mausbewegung und Knotenmodus eine kleine Verzögerung besteht.

Ich habe versucht, die folgenden Einstellungen es JVM

-Djavafx.animation.fullspeed=true 
-Dprism.vsync=false 

Aber es half nicht an, vielleicht weil ich Linux verwenden - nicht kennen.

Gibt es eine weitere optimale Möglichkeit, absolut positionierten Knoten in JavaFX zu verschieben?

+0

Verwenden Sie 'StackPane' niemals, wenn Sie' Node's verschieben müssen. – Sedrick

+0

https://stackoverflow.com/questions/10682107/correct-way-to-move-a-node-by-dragging-in-javafx-2 – Sedrick

Antwort

0

Ihr Code kämpft ständig gegen den Layout-Mechanismus des StackPane. Für die absolute Positionierung von Knoten sollten Sie immer einen Bereich direkt verwenden. In manchen Situationen kann es auch möglich sein, ein AnchorPane zu verwenden.

+0

Vielen Dank für die Antwort. Ich habe es mit Pane versucht und vbox.setLayoutX/Y() benutzt. Ich sehe die gleiche Verzögerung. –

Verwandte Themen