2016-06-15 12 views
0

Erstellen einer javaFX-Anwendung, die Positionen, Breite und Tiefe von Rechtecken aus der Datenbank abruft, um sie zu zeichnen. Die Datenbank enthält Rechtecke posX, posY, Breite und Tiefe entsprechend einer tatsächlichen Fensterbreite und -tiefe. Ich war in der Lage, die Rechtecke entsprechend dem Fenster zu zeichnen, auf das ich lokal zeichne, das Problem ist, weiß nicht, wie man die Datenbank mit den neuen Werten aktualisiert, wenn ein Rechteck gezogen wird, weil ich sie zurück zur tatsächlichen Koordination verwandeln sollte code:JavaFX Speicherort von ziehbaren Knoten speichern

// resourcePosX,resourcePosY,resourceDepth and resourceWidth are the actual 
// rectangle dimensions from the database 
// actualDepth and actualWidth are the actual pane dimensions 
// prefWidth and prefHight are the current pane dimensions that i am drawing on 
int posX = (resourcePosX*this.prefHight)/actualDepth; 
int posY = (resourcePosY*this.prefWidth)/actualWidth; 

int depth = (resourceDepth*this.prefHight)/actualDepth; 
int wedth = (resourceWidth*this.prefWidth)/actualWidth; 

Node resource= new Rectangle(posX, posY, depth, wedth); 
EventHandler<MouseEvent> onMousePressedEventHandler = new EventHandler<MouseEvent>() { 

      @Override 
      public void handle(MouseEvent t) { 
       orgSceneX = t.getSceneX(); 
       orgSceneY = t.getSceneY(); 
       orgTranslateX = ((Node) (t.getSource())).getTranslateX(); 
       orgTranslateY = ((Node) (t.getSource())).getTranslateY(); 
      } 
     }; 

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

      @Override 
      public void handle(MouseEvent t) { 
       double offsetX = t.getSceneX() - orgSceneX; 
       double offsetY = t.getSceneY() - orgSceneY; 
       double newTranslateX = orgTranslateX + offsetX; 
       double newTranslateY = orgTranslateY + offsetY; 

       ((Node) (t.getSource())).setTranslateX(newTranslateX); 
       ((Node) (t.getSource())).setTranslateY(newTranslateY); 
      } 
     }; 

     resource.setOnMouseDragged(onMouseDraggedEventHandler); 


     resource.setOnMousePressed(onMousePressedEventHandler); 

Wie konvertiert man die Rechtecke aktuell x und y wieder in die aktuelle? um sie in der Datenbank zu speichern.


wäre es einfacher oder besser, Leinwand zu verwenden? Da ich nichts über Leinwand bis jetzt weiß

Antwort

1

Sie könnten einen setOnMouseReleased Maushandler erstellen und eine fixPostion() Methode verwenden, die die aktuelle Position unter Verwendung der aktuellen Position plus der übersetzten Position berechnet.

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

    @Override 
    public void handle(MouseEvent t) { 

    fixPosition((Node) t.getSource()); 

    } 
}; 

resource.setOnMouseReleased(onMouseReleasedEventHandler); 

private void fixPosition(Node node) { 

    double x = node.getTranslateX(); 
    double y = node.getTranslateY(); 

    node.relocate(node.getLayoutX() + x, node.getLayoutY() + y); 

    node.setTranslateX(0); 
    node.setTranslateY(0); 

} 
+0

die Sache ist node.getLayoutX() und node.getLayoutY() sind immer 0? Warum ist das>? –

+0

wäre es besser, mit Canvas zu implementieren? Danke im fortgeschrittenen –

+1

Sie sind 0, weil Sie alles mit den Übersetzungsmethoden positionieren und den Standort layoutX/Y ignorieren. Mit anderen Worten, der endgültige Ort = [layoutX] (https://docs.oracle.com/javase/8/javafx/api/javafx/scene/Node.html#layoutXProperty) + [translateX] (https: // docs .oracle.com/javase/8/javafx/api/javafx/scene/Node.html # setTranslateX-double-). Imo benutze keine Leinwand, es ist mehr Arbeit für dich. Außerdem schlage ich vor, dass Sie über die Klasse [Node] (https://docs.oracle.com/javase/8/javafx/api/javafx/scene/Node.html) lesen. – Roland

Verwandte Themen