JavaFX-根据鼠标位置在画布上放大和缩小

JavaFX-根据鼠标位置在画布上放大和缩小,java,javafx,canvas,mvvm,zooming,Java,Javafx,Canvas,Mvvm,Zooming,我正在画布上画一个迷宫。我想允许用户通过按CTRL键和鼠标旋转键放大和缩小迷宫。但是我需要根据鼠标位置进行缩放 我的代码可以工作,但它使缩放始终位于迷宫的左上角,而不是基于鼠标位置 如何根据鼠标位置进行放大/缩小操作 在我的FXML文件中,我声明: onScroll="#Zoom" 在我的主控件类中,我声明了缩放函数: public void Zoom(ScrollEvent scrollEvent) { mazeDisplayer.zoom(scrollEvent);

我正在画布上画一个迷宫。我想允许用户通过按CTRL键和鼠标旋转键放大和缩小迷宫。但是我需要根据鼠标位置进行缩放

我的代码可以工作,但它使缩放始终位于迷宫的左上角,而不是基于鼠标位置

如何根据鼠标位置进行放大/缩小操作

在我的FXML文件中,我声明:

onScroll="#Zoom"
在我的主控件类中,我声明了缩放函数:

    public void Zoom(ScrollEvent scrollEvent) {
        mazeDisplayer.zoom(scrollEvent);
    }
调用扩展画布的MazeDisplayer类:

package View;

import algorithms.mazeGenerators.Maze;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.control.Alert;
import javafx.scene.image.Image;
import javafx.scene.input.ScrollEvent;
import javafx.scene.paint.Color;

import java.awt.*;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class  MazeDisplayer extends Canvas {

    private Maze m;
    private int row_player;
    private int col_player;
    private SolDisplayer solDisplayer;
    private double for_zoom =1.05;
  //  public static int d=0;
    StringProperty imageFileNameWall = new SimpleStringProperty();
    StringProperty imageFileNamePlayer = new SimpleStringProperty();
    StringProperty imageFileNameEnd = new SimpleStringProperty();





    public int getRow_player() {
        return row_player;
    }

    public int getCol_player() {
        return col_player;
    }




    public void set_player_position(int row, int col){
        this.row_player = row;
        this.col_player = col;
        draw();


    }

    public void set_player_position_without_draw(int row, int col){
        this.row_player = row;
        this.col_player = col;

        }
    public void drawMaze(Maze maze)
    {
        this.m = maze;
        draw();
    }

    public void draw()
    {
        if( m!=null)
        {
            double canvasHeight = getHeight();
            double canvasWidth = getWidth();
            int row = m.getNumOfRows();
            int col = m.getNumOfCols();
            double cellHeight = canvasHeight/row;
            double cellWidth = canvasWidth/col;
            GraphicsContext graphicsContext = getGraphicsContext2D();
            graphicsContext.clearRect(0,0,canvasWidth,canvasHeight);
            graphicsContext.setFill(Color.CHOCOLATE);
            double w,h;
            int [][] matrix=m.getMatrix();
            //Draw Maze
            Image wallImage = null;
            try {
                wallImage = new Image(new FileInputStream(getImageFileNameWall()));
            } catch (FileNotFoundException e) {
                System.out.println("There is no file....");
            }
            for(int i=0;i<row;i++)
            {
                for(int j=0;j<col;j++)
                {
                    if(matrix[i][j] == 1) // Wall
                    {
                        h = i * cellHeight;
                        w = j * cellWidth;
                        if (wallImage == null){
                            graphicsContext.fillRect(w,h,cellWidth,cellHeight);
                        }else{
                            graphicsContext.drawImage(wallImage,w,h,cellWidth,cellHeight);
                        }
                    }

                }
            }
            {
                double h_player=this.getRow_player() * cellHeight;
                double w_player=this.getCol_player() * cellWidth;
                Image playerImage = null;
                try {
                    playerImage = new Image(new FileInputStream(getImageFileNamePlayer()));
                } catch (FileNotFoundException e) {
                    System.out.println("There is no Image player....");
                }
                graphicsContext.drawImage(playerImage,w_player,h_player,cellWidth,cellHeight);
            }

            double h_end = this.m.getGoalPosition().getRowIndex() * cellHeight;
            double w_end = this.m.getGoalPosition().getColumnIndex() * cellWidth;
            Image endImage = null;
            try {
                endImage = new Image(new FileInputStream(getImageFileNameEnd()));
            } catch (FileNotFoundException e) {
                System.out.println("There is no Image player....");
            }
            graphicsContext.drawImage(endImage,w_end,h_end,cellWidth,cellHeight);
        }
    }

    public void zoom (ScrollEvent scrollEvent){
        if(scrollEvent.isControlDown()) {
            if (scrollEvent.getDeltaY() < 0)
            {
                setHeight(getHeight() / for_zoom);
                setWidth(getWidth() / for_zoom);
                draw();
                }
            }
            if (scrollEvent.getDeltaY() > 0) {
                if(getWidth()>6300 || getHeight()>6300)
                    setHeight(getHeight()*for_zoom);
                    setWidth(getWidth() * for_zoom);
                    draw();
                }
            }
        }
    }

}

包视图;
导入算法.mazeGenerators.Maze;
导入javafx.beans.property.SimpleStringProperty;
导入javafx.beans.property.StringProperty;
导入javafx.scene.canvas.canvas;
导入javafx.scene.canvas.GraphicsContext;
导入javafx.scene.control.Alert;
导入javafx.scene.image.image;
导入javafx.scene.input.ScrollEvent;
导入javafx.scene.paint.Color;
导入java.awt.*;
导入java.io.FileInputStream;
导入java.io.FileNotFoundException;
公共类MazeDisplayer扩展画布{
私人迷宫m;
私人int row_播放器;
私人内线球员;
专用SolDisplayer-SolDisplayer;
_zoom的专用双精度=1.05;
//公共静态int d=0;
StringProperty imageFileNameWall=新的SimpleStringProperty();
StringProperty imageFileNamePlayer=新的SimpleStringProperty();
StringProperty imageFileNameEnd=新的SimpleStringProperty();
public int getRow_player(){
返回排球员;
}
public int getCol_player(){
返回col_播放器;
}
公共无效集\玩家\位置(整数行,整数列){
this.row\u player=行;
this.col\u player=col;
draw();
}
公共无效设置\u玩家\u位置\u无\u绘制(整数行,整数列){
this.row\u player=行;
this.col\u player=col;
}
公共空间迷宫(迷宫)
{
m=迷宫;
draw();
}
公众抽签()
{
如果(m!=null)
{
双画布高度=getHeight();
双画布宽度=getWidth();
int row=m.getnumorrows();
int col=m.getNumOfCols();
双单元格高度=画布高度/行;
双单元格宽度=画布宽度/列;
GraphicsContext GraphicsContext=getGraphicsContext2D();
graphicsContext.clearRect(0,0,画布宽度,画布高度);
graphicsContext.setFill(颜色.巧克力色);
双w,h;
int[][]矩阵=m.getMatrix();
//画迷宫
Image wallImage=null;
试一试{
wallImage=新图像(新文件输入流(getImageFileNameWall());
}catch(filenotfounde异常){
System.out.println(“没有文件…”);
}
对于(int i=0;i6300 | | getHeight()>6300)
设置高度(getHeight()*用于缩放);
setWidth(getWidth()*用于缩放);
draw();
}
}
}
}
}