JavaFX:如何通过设置的纵横比调整矩形的大小

标签 java javafx aspect-ratio drawrectangle

我有一个应用程序,用户可以在其中绘制矩形,并调整其大小或移动它。我感兴趣是否有可能以某种纵横比绑定(bind)矩形的宽度和高度。

例如如果长宽比为 1:2,则用户只能绘制该种矩形,如果长宽比为 1:1,则用户只能绘制正方形。

编辑 我的 MOUSE_DRAGGED 事件的 eventHandler 看起来像这样

        EventHandler<MouseEvent> onMouseDraggedEventHandler = event -> {
        if (event.isSecondaryButtonDown())
            return;

        double offsetX = event.getX() - rectangleStartX;
        double offsetY = event.getY() - rectangleStartY;

        if (offsetX > 0) {
            if (event.getX() > imageView.getFitWidth()) {
                selectionRectangle.setWidth(imageView.getFitWidth() - rectangleStartX);
            } else
                selectionRectangle.setWidth(offsetX);
        } else {
            if (event.getX() < 0)
                selectionRectangle.setX(0);
            else
                selectionRectangle.setX(event.getX());
            selectionRectangle.setWidth(rectangleStartX - selectionRectangle.getX());
        }

        if (offsetY > 0) {
            if (event.getY() > imageView.getFitHeight())
                selectionRectangle.setHeight(imageView.getFitHeight() - rectangleStartY);
            else
                selectionRectangle.setHeight(offsetY);
        } else {
            if (event.getY() < 0)
                selectionRectangle.setY(0);
            else
                selectionRectangle.setY(event.getY());
            selectionRectangle.setHeight(rectangleStartY - selectionRectangle.getY());
        }

    };

最佳答案

此应用演示如何根据比例调整矩形高度和宽度。代码中的注释。

import javafx.application.Application;
import javafx.scene.Cursor;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

/**
 *
 * @author blj0011
 */
public class JavaFXApplication122 extends Application
{

    double orgSceneX, orgSceneY;//Used to help keep up with change in mouse position

    @Override
    public void start(Stage primaryStage)
    {
        double RATIO = .5;//The ration of height to width is 1/2

        Rectangle rectangle = new Rectangle(100, 50);
        rectangle.setX(400 - 50);
        rectangle.setY(250 - 25);
        rectangle.setFill(Color.TRANSPARENT);
        rectangle.setStroke(Color.BLACK);

        //Circles will be used to do the event handling/movements
        Circle leftAnchor = new Circle(400 - 50, 250, 5);
        Circle topAnchor = new Circle(400, 250 - 25, 5);

        leftAnchor.setOnMouseDragEntered((event) -> {
            ((Circle) event.getSource()).getScene().setCursor(Cursor.MOVE);
        });
        leftAnchor.setOnMousePressed((event) -> {
            orgSceneX = event.getSceneX();//Store current mouse position
        });
        leftAnchor.setOnMouseDragged((event) -> {
            double offSetX = event.getSceneX() - orgSceneX;//Find change in mouse X position

            leftAnchor.setCenterX(event.getSceneX());
            rectangle.setX(event.getSceneX());//move rectangle left side with mouse
            rectangle.setWidth(rectangle.getWidth() - offSetX);//Change rectangle's width with movement of mouse
            topAnchor.setCenterX(topAnchor.getCenterX() + offSetX / 2);//Adjust top circle as rectangle's size change
            rectangle.setHeight(rectangle.getWidth() * RATIO);//Change the height so that it meets the ratio requirements
            leftAnchor.setCenterY((rectangle.getY() + rectangle.getHeight()) - (rectangle.getHeight() / 2));//Adjust the left circle with the growth of the rectangle

            orgSceneX = event.getSceneX();//save last mouse position to recalculate change in mouse postion as the circle moves
        });
        leftAnchor.setOnMouseExited((event) -> {
            leftAnchor.getScene().setCursor(null);
        });

        topAnchor.setOnMouseDragEntered((event) -> {
            topAnchor.getScene().setCursor(Cursor.MOVE);
        });
        topAnchor.setOnMousePressed((event) -> {
            orgSceneY = event.getSceneY();//store current mouse position
        });
        topAnchor.setOnMouseDragged((event) -> {
            double offSetY = event.getSceneY() - orgSceneY;

            topAnchor.setCenterY(event.getSceneY());
            rectangle.setY(event.getSceneY());//move rectangle top side with mouse
            rectangle.setHeight(rectangle.getHeight() - offSetY);//Change rectangle's height with movement of mouse
            leftAnchor.setCenterY(leftAnchor.getCenterY() + offSetY / 2);//Adjust left circle as rectangle's size change
            rectangle.setWidth(rectangle.getHeight() * (1 / RATIO));//Change the width so that it meets the ratio requirements
            topAnchor.setCenterX((rectangle.getX() + rectangle.getWidth()) - (rectangle.getWidth() / 2));//Adjust the top circle with the growth of the rectangle

            orgSceneY = event.getSceneY();//save last mouse position to recalculate change in mouse postion as the circle moves
        });
        topAnchor.setOnMouseExited((event) -> {
            topAnchor.getScene().setCursor(null);
        });

        Pane root = new Pane();
        root.getChildren().addAll(rectangle, leftAnchor, topAnchor);

        Scene scene = new Scene(root, 800, 500);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)
    {
        launch(args);
    }

}

关于JavaFX:如何通过设置的纵横比调整矩形的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48926063/

相关文章:

Java - 非泛型类扩展泛型类

java - 如何在 hadoop 文件系统上为 Java 程序设置类路径

java - 对于泛型,lambda 中的错误返回类型

javafx - 如何设置 JavaFX 对话框标签宽度

JavaFX 将 Pane 悬停在 Pane 上

android - 设备纵横比(媒体查询)不适用于 Droid 2

ios - 真的在自动布局上苦苦挣扎 - 4 个按钮排列成 2x2

Java KeyBind-判断按键释放事件

java - 如何让 JavaFX 确认警报框等到按下“确定”,但在按下其他按钮时执行其他操作

css - 根据高度保持div纵横比