2016-11-06 61 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

相关问题