2016-11-06 60 views
0

我正在使用JavaFX構建繪圖程序。我試圖用GraphicsContext繪製一個Rectangle,並設法讓它在畫布上繪製。但是,無論我點擊什麼,它總是從原點開始。當我釋放鼠標(這是正確完成的)時,矩形會停止繪製,但當按下鼠標時不會繪製該矩形。這裏是我的代碼:如何將JavaFX上繪製的矩形的原點更改爲我點擊鼠標的位置?

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()); 
    }; 

} 

任何幫助將不勝感激。

+0

也許你應該先獲取鼠標的x和y位置或事件的x和y位置。然後使用這些值來知道在哪裏創建矩形。您應該在鼠標點擊處理程序中創建一個新的Rectangle。另外,在你的代碼中,我沒有看到你設置矩形的位置。 – Sedrick

+0

您好@SedrickJefferson,我在這裏設置位置:'graphicsContext.strokeRect(startX,startY,width,height);'?或者這是不正確的做法嗎? – xn139

+0

請勿使用邊框窗格。邊框窗格是一個佈局窗格,用於管理其子節點的佈局;你應該把矩形放在一個普通的「窗格」中。 –

回答

0

這是接近你問的嗎?

@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); 
} 

您需要爲此做些工作。這很粗糙。

+0

謝謝你的SedrickJefferson,這正是我所問的。 – xn139

相關問題