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

标签 java javafx mouseevent coordinates nodes

我创建了一个应用程序,它使用 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/

相关文章:

javascript - 有没有办法在离开文档正文时触发 mouseup?

JavaFX:使用自定义 Formatter 将 LocalDateProperty 绑定(bind)到 StringProperty

JavaFX Dropshadow CSS : What do the parameters mean? 如何在CSS中实现宽度和高度?

c++ - Qt5 C++ 自动点击鼠标

java - 如何获取java版本1.7.0_101的jdk?

java - Spring-注入(inject)的变量为空

python - opencv上的鼠标事件

java - 如何访问Amazon S3上的索引Lucene?

java - JComboBox setBackground() 不改变箭头的颜色

Java Swing setEditable(boolean) 无法在具有自定义渲染器的 JComboBox 中工作