2016-11-06 2 views
0

Ich baue ein Malprogramm mit JavaFX. Ich versuche, ein Rectangle mit GraphicsContext zu zeichnen und es geschafft, es auf der Leinwand zu zeichnen. Aber egal, wo ich klicke, es beginnt immer am Ursprung. Das Rechteck wird nicht mehr gezeichnet, wenn ich die Maus loslasse (das ist korrekt), aber es wird nicht gezeichnet, wenn ich die Maus drücke. Hier ist mein Code:Wie ändere ich den Ursprung des Rectangle, das auf JavaFX gezeichnet wird, wo ich mit meiner Maus klicke?

public RectController(Canvas c, Scene s, BorderPane borderPane){ 
    this.borderPane = borderPane; 
    this.scene = scene; 
    this.graphicsContext = canvas.getGraphicsContext2D(); 

    rectangle = new Rectangle(); 
    rectangle.setStrokeWidth(1.0); 
    rectangle.setManaged(true); 
    rectangle.setMouseTransparent(true); 

    //when you first press down on the mouse 
    pressMouse = event -> { 
    // borderPane.getChildren().add(rectangle); --> REMOVED 
     double startX = event.getX(); 
     double startY = event.getY(); 
    }; 

    releaseMouse = event -> { 
     borderPane.getChildren().remove(rectangle); 
     double width = Math.abs(event.getX() - startX); 
     double height = Math.abs(event.getY() - startY); 
     graphicsContext.strokeRect(startX, startY, width, height); 
     borderPane.setOnMousePressed(null); 
     borderPane.setOnMouseDragged(null); 
     borderPane.setOnMouseReleased(null); 
    }; 

    dragMouse = event -> { 
     rectangle.setWidth(event.getX()); 
     rectangle.setHeight(event.getY()); 
    }; 

} 

Jede Hilfe wäre sehr willkommen.

+0

Vielleicht sollten Sie zuerst die Maus x und y Ort oder die Ereignis x und y Ort. Verwenden Sie diese Werte, um zu wissen, wo ein Rechteck erstellt werden soll. Sie sollten ein neues Rechteck in Ihrem Mausklick-Handler erstellen. Außerdem sehe ich nirgendwo in Ihrem Code die Position des Rechtecks. – Sedrick

+0

Hi @SedrickJefferson, ich setze den Ort hier: 'graphicsContext.strokeRect (startX, startY, width, height);'? Oder ist das ein falscher Weg, es zu tun? – xn139

+0

Verwenden Sie kein Rahmenfenster. Ein Rahmenbereich ist ein Layoutbereich, der das Layout seiner untergeordneten Knoten verwaltet. Sie sollten das Rechteck in ein einfaches "Pane" setzen. –

Antwort

0

Ist das nah an dem, was Sie fragen?

@FXML AnchorPane apMain; 

Rectangle rectangle; 

@Override 
public void initialize(URL url, ResourceBundle rb) { 

} 

@FXML void handleOnMouseClick(MouseEvent event) 
{ 
    double x = event.getSceneX(); 
    double y = event.getSceneY(); 

    rectangle = new Rectangle(); 
    rectangle.setX(x); 
    rectangle.setY(y); 
    rectangle.setWidth(25); 
    rectangle.setHeight(25); 
    apMain.getChildren().add(rectangle); 

} 

@FXML void handleOnMouseDrag(MouseEvent event) 
{ 

    rectangle.setWidth(event.getSceneX() - x); 
    rectangle.setHeight(event.getSceneY() - y); 
} 

@FXML void handleOnMouseRelease(MouseEvent event) 
{ 
    apMain.getChildren().remove(rectangle); 
} 

Sie müssen dazu arbeiten. Es ist grob.

+0

Danke für diesen SedrickJefferson, genau das habe ich gefragt. – xn139

Verwandte Themen