gpt4 book ai didi

java - 单击网格面板返回坐标

转载 作者:行者123 更新时间:2023-11-30 05:45:48 25 4
gpt4 key购买 nike

我创建了一个应用程序,它使用 GridPanel 生成一个带有网格图案的板,该板由在 javaFX 中保存方形对象的节点组成。以下是当前输出:

enter image description here

我想知道单击节点后如何返回节点的坐标。我知道我必须使用某种 Action 监听器,但我对节点坐标并不完全熟悉。

以下是当前的源代码,非常感谢。

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class MainApp extends Application {

private final double windowWidth = 1000;
private final double windowHeight = 1000;

/*n is amount of cells per row
m is amount of cells per column*/
private final int n = 50;
private final int m = 50;

double gridWidth = windowWidth / n;
double gridHeight = windowHeight / m;

MyNode[][] playfield = new MyNode[n][m];

public static void main(String[] args) {
launch(args);
}

@Override
public void start(Stage primaryStage) {

Group root = new Group();

// initialize playfield
for( int i=0; i < n; i++) {
for( int j=0; j < m; j++) {

// create node
MyNode node = new MyNode( i * gridWidth, j * gridHeight, gridWidth, gridHeight);

// add node to group
root.getChildren().add( node);

// add to playfield for further reference using an array
playfield[i][j] = node;

}
}

Scene scene = new Scene( root, windowWidth, windowHeight);

primaryStage.setScene( scene);
primaryStage.show();
primaryStage.setResizable(false);
primaryStage.sizeToScene();
}

public static class MyNode extends StackPane {

public MyNode(double x, double y, double width, double height) {

// create rectangle
Rectangle rectangle = new Rectangle( width, height);
rectangle.setStroke(Color.BLACK);
rectangle.setFill(Color.LIGHTGREEN);

// set position
setTranslateX(x);
setTranslateY(y);

getChildren().addAll(rectangle);
}
}
}

最佳答案

您可以将鼠标事件处理程序添加到根目录:

  root.setOnMousePressed(e->mousePressedOnRoot(e));

其中 mousePressedOnRoot(e) 定义为

  private void mousePressedOnRoot(MouseEvent e) {
System.out.println("mouse pressed on (x-y): "+e.getSceneX()+"-"+e.getSceneY());
}

编辑: 或者,您可以通过添加 setOnMousePressed(e->mousePressedOnNode(e)); 向每个 MyNode 实例添加鼠标事件处理程序;到它的构造函数。

并添加方法:

 private void mousePressedOnNode(MouseEvent e) {
System.out.println("mouse pressed on (x-y): "+e.getSceneX()+"-"+e.getSceneY());
}

如果您需要单击节点内的坐标,请使用e.getX()e.getY()

关于java - 单击网格面板返回坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54857516/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com