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