Javafx 拖动时绘制圆角矩形失败

Javafx 拖动时绘制圆角矩形失败,javafx,javafx-2,Javafx,Javafx 2,我试图在javafx中拖动鼠标时绘制一个带有圆角的简单矩形。 第一个问题:我无法使左上角变圆。 第二个问题:我希望我的应用程序能够画出漂亮的全圆角矩形,而不是像我图片中的第二个。 请问,我怎样才能修理这些? 提前感谢你的帮助 这是我的密码: import javafx.application.Application; import javafx.event.EventHandler; import javafx.scene.Group; import javafx.scene.Scene; im

我试图在javafx中拖动鼠标时绘制一个带有圆角的简单矩形。 第一个问题:我无法使左上角变圆。 第二个问题:我希望我的应用程序能够画出漂亮的全圆角矩形,而不是像我图片中的第二个。 请问,我怎样才能修理这些? 提前感谢你的帮助

这是我的密码:

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class Main extends Application {
  public static void main(String[] args) {
      launch(args);
  }

  public void start(Stage stage){
      stage.setTitle("Test");        
      root = new BorderPane();     
      Scene scene = new Scene(root, 400, 400);
      paintings = new Group();
      stage.setScene(scene);

      canvas = new Rectangle(0, 0, stage.getScene().getWidth(), stage.getScene().getHeight());
      canvas.setFill(Color.WHITE);

      addHandlers();

      root.setCenter(canvas);  
      root.getChildren().add(paintings);
      stage.show();
   }

  private void paintRectangle(){
      roundedRect = new Rectangle(pressedX, 
                    pressedY, 
                    draggedX - pressedX, 
                    draggedY - pressedY);
      roundedRect.setFill(Color.RED);
      roundedRect.setArcHeight(40);
      roundedRect.setArcWidth(40);        
      paintings.getChildren().add(roundedRect);
  }

  private void addHandlers(){
     canvas.setOnMousePressed(new EventHandler<MouseEvent>() {

          @Override
          public void handle(MouseEvent me) {                
              pressedX = me.getX();
              pressedY = me.getY();
          }
      });

     canvas.setOnMouseReleased(new EventHandler<MouseEvent>() {

          @Override
          public void handle(MouseEvent me) {                
              /* If I make the drawing in here, I get round corners, but it doesn't get drawn while dragging*/
              //paintRectangle();
          }
      });

      canvas.setOnMouseDragged(new EventHandler<MouseEvent>() {

          @Override
          public void handle(MouseEvent me) {                
              draggedX =  me.getX();
              draggedY =  me.getY();
              paintRectangle();

          }
      });
  }
  double pressedX, pressedY;
  double draggedX, draggedY;
  Rectangle canvas;
  Group paintings;
  Rectangle roundedRect;
  BorderPane root;

}
导入javafx.application.application;
导入javafx.event.EventHandler;
导入javafx.scene.Group;
导入javafx.scene.scene;
导入javafx.scene.input.MouseEvent;
导入javafx.scene.layout.BorderPane;
导入javafx.scene.paint.Color;
导入javafx.scene.shape.Rectangle;
导入javafx.stage.stage;
公共类主扩展应用程序{
公共静态void main(字符串[]args){
发射(args);
}
公众假期开始(阶段){
阶段。设置标题(“测试”);
root=新边框窗格();
场景=新场景(根,400400);
绘画=新组();
舞台场景;
画布=新矩形(0,0,stage.getScene().getWidth(),stage.getScene().getHeight());
画布。设置填充(颜色。白色);
addHandlers();
root.setCenter(画布);
root.getChildren().add(绘画);
stage.show();
}
私有void paintRectangle(){
roundedRect=新矩形(按X,
按,
draggedX-pressedX,
draggedY-pressedY);
圆形选边填充(颜色为红色);
圆形直射集光(40);
圆截面设置弧宽(40);
paints.getChildren().add(roundedRect);
}
私有void addHandlers(){
setOnMousePressed(新的EventHandler(){
@凌驾
公共无效句柄(MouseEvent me){
pressedX=me.getX();
pressedY=me.getY();
}
});
setOnMouseReleased(新的EventHandler(){
@凌驾
公共无效句柄(MouseEvent me){
/*如果我在这里画画,我会画圆角,但拖动时不会画*/
//paintRectangle();
}
});
setOnMouseDrawed(新的EventHandler(){
@凌驾
公共无效句柄(MouseEvent me){
draggedX=me.getX();
draggedY=me.getY();
paintRectangle();
}
});
}
双按X,按Y;
双draggedX,draggedY;
矩形画布;
组画;
矩形圆形;
边缘根;
}
这是我的照片:
我无法检查您的代码,但这里有一种替代方法。您可以将其与代码合并:

import javafx.application.Application;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class Daer extends Application {

    BorderPane pane;
    Rectangle rect;
    SimpleDoubleProperty rectinitX = new SimpleDoubleProperty();
    SimpleDoubleProperty rectinitY = new SimpleDoubleProperty();
    SimpleDoubleProperty rectX = new SimpleDoubleProperty();
    SimpleDoubleProperty rectY = new SimpleDoubleProperty();

    @Override
    public void start(Stage stage) {

        pane = new BorderPane();
        Scene scene = new Scene(pane, 800, 600);
        stage.setScene(scene);

        scene.setOnMouseDragged(mouseHandler);
        scene.setOnMousePressed(mouseHandler);
        scene.setOnMouseReleased(mouseHandler);

        rect = getNewRectangle();
        rect.widthProperty().bind(rectX.subtract(rectinitX));
        rect.heightProperty().bind(rectY.subtract(rectinitY));
        pane.getChildren().add(rect);
        stage.show();
    }

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

        @Override
        public void handle(MouseEvent mouseEvent) {

            if (mouseEvent.getEventType() == MouseEvent.MOUSE_PRESSED) {
                rect.setX(mouseEvent.getX());
                rect.setY(mouseEvent.getY());
                rectinitX.set(mouseEvent.getX());
                rectinitY.set(mouseEvent.getY());
            } else if (mouseEvent.getEventType() == MouseEvent.MOUSE_DRAGGED) {
                rectX.set(mouseEvent.getX());
                rectY.set(mouseEvent.getY());
            } else if (mouseEvent.getEventType() == MouseEvent.MOUSE_RELEASED) {
                // Clone the rectangle
                Rectangle r = getNewRectangle();
                r.setX(rect.getX());
                r.setY(rect.getY());
                r.setWidth(rect.getWidth());
                r.setHeight(rect.getHeight());
                pane.getChildren().add(r);

                // Hide the rectangle
                rectX.set(0);
                rectY.set(0);
            }
        }
    };

    private Rectangle getNewRectangle() {
        Rectangle r = new Rectangle();
        r.setFill(Color.web("blue", 0.1));
        r.setStroke(Color.BLUE);
        r.setArcHeight(40);
        r.setArcWidth(40);
        return r;
    }

    public static void main(String[] args) {
        launch(args);
    }
}
导入javafx.application.application;
导入javafx.beans.property.SimpleDoubleProperty;
导入javafx.event.EventHandler;
导入javafx.scene.scene;
导入javafx.scene.input.MouseEvent;
导入javafx.scene.layout.BorderPane;
导入javafx.scene.paint.Color;
导入javafx.scene.shape.Rectangle;
导入javafx.stage.stage;
公共类Daer扩展应用程序{
边框窗格;
矩形矩形;
SimpleDoubleProperty rectinitX=新的SimpleDoubleProperty();
SimpleDoubleProperty rectiny=新的SimpleDoubleProperty();
SimpleDoubleProperty rectX=新的SimpleDoubleProperty();
SimpleDoubleProperty rectY=新的SimpleDoubleProperty();
@凌驾
公众假期开始(阶段){
窗格=新边框窗格();
场景=新场景(窗格,800600);
舞台场景;
场景。SetonMouseDrawed(鼠标手柄);
场景。设置鼠标按下(鼠标手柄);
场景。setOnMouseReleased(鼠标手柄);
rect=getNewRectangle();
widthProperty()绑定(rectX.subtract(rectinitX));
rect.heightProperty().bind(rectY.subtract(rectinitY));
pane.getChildren().add(rect);
stage.show();
}
EventHandler mouseHandler=neweventhandler(){
@凌驾
公共无效句柄(MouseEvent MouseEvent){
if(mouseEvent.getEventType()==mouseEvent.MOUSE_按下){
setX(mouseEvent.getX());
setY(mouseEvent.getY());
rectinitX.set(mouseEvent.getX());
set(mouseEvent.getY());
}else if(mouseEvent.getEventType()==mouseEvent.MOUSE\u拖动){
set(mouseEvent.getX());
set(mouseEvent.getY());
}else if(mouseEvent.getEventType()==mouseEvent.MOUSE_已释放){
//克隆矩形
矩形r=getNewRectangle();
r、 setX(rect.getX());
r、 setY(rect.getY());
r、 setWidth(rect.getWidth());
r、 setHeight(rect.getHeight());
pane.getChildren().add(r);
//隐藏矩形
rectX.set(0);
矩形集(0);
}
}
};
私有矩形getNewRectangle(){
矩形r=新矩形();
r、 setFill(Color.web(“蓝色”,0.1));
r、 设定行程(颜色:蓝色);
r、 setArcHeight(40);
r、 设置弧宽(40);
返回r;
}
公共静态void main(字符串[]args){
发射(args);
}
}

我无法检查您的代码,但这里有一种替代方法。您可以将其与代码合并:

import javafx.application.Application;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class Daer extends Application {

    BorderPane pane;
    Rectangle rect;
    SimpleDoubleProperty rectinitX = new SimpleDoubleProperty();
    SimpleDoubleProperty rectinitY = new SimpleDoubleProperty();
    SimpleDoubleProperty rectX = new SimpleDoubleProperty();
    SimpleDoubleProperty rectY = new SimpleDoubleProperty();

    @Override
    public void start(Stage stage) {

        pane = new BorderPane();
        Scene scene = new Scene(pane, 800, 600);
        stage.setScene(scene);

        scene.setOnMouseDragged(mouseHandler);
        scene.setOnMousePressed(mouseHandler);
        scene.setOnMouseReleased(mouseHandler);

        rect = getNewRectangle();
        rect.widthProperty().bind(rectX.subtract(rectinitX));
        rect.heightProperty().bind(rectY.subtract(rectinitY));
        pane.getChildren().add(rect);
        stage.show();
    }

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

        @Override
        public void handle(MouseEvent mouseEvent) {

            if (mouseEvent.getEventType() == MouseEvent.MOUSE_PRESSED) {
                rect.setX(mouseEvent.getX());
                rect.setY(mouseEvent.getY());
                rectinitX.set(mouseEvent.getX());
                rectinitY.set(mouseEvent.getY());
            } else if (mouseEvent.getEventType() == MouseEvent.MOUSE_DRAGGED) {
                rectX.set(mouseEvent.getX());
                rectY.set(mouseEvent.getY());
            } else if (mouseEvent.getEventType() == MouseEvent.MOUSE_RELEASED) {
                // Clone the rectangle
                Rectangle r = getNewRectangle();
                r.setX(rect.getX());
                r.setY(rect.getY());
                r.setWidth(rect.getWidth());
                r.setHeight(rect.getHeight());
                pane.getChildren().add(r);

                // Hide the rectangle
                rectX.set(0);
                rectY.set(0);
            }
        }
    };

    private Rectangle getNewRectangle() {
        Rectangle r = new Rectangle();
        r.setFill(Color.web("blue", 0.1));
        r.setStroke(Color.BLUE);
        r.setArcHeight(40);
        r.setArcWidth(40);
        return r;
    }

    public static void main(String[] args) {
        launch(args);
    }
}
导入javafx.application.application;
导入javafx.beans.property.SimpleDoubleProperty;
导入javafx.event.EventHandler;
导入javafx.scene.scene;
导入javafx.scene.input.MouseEvent;
导入javafx.scene.layout.BorderPane;
导入javafx.scene.paint.Color;
导入javafx.scene.shape.Rectangle;
导入javafx.stage.stage;
公共类Daer扩展应用程序{
边框窗格;
矩形矩形;
SimpleDoubleProperty rectinitX=新的SimpleDoubleProperty();
SimpleDoubleProperty rectinitY=新SimpleDouble