Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 单击“栅格”面板返回坐标_Java_Javafx_Mouseevent_Coordinates_Nodes - Fatal编程技术网

Java 单击“栅格”面板返回坐标

Java 单击“栅格”面板返回坐标,java,javafx,mouseevent,coordinates,nodes,Java,Javafx,Mouseevent,Coordinates,Nodes,我创建了一个应用程序,它使用GridPanel生成一个带有网格模式的板,其中包含在javaFX中保存方形对象的节点。以下是电流输出: 我想知道单击节点后如何返回节点的坐标。我知道我必须使用某种类型的动作监听器,但对于节点坐标我并不完全熟悉 下面是当前的源代码,非常感谢 import javafx.application.Application; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.l

我创建了一个应用程序,它使用GridPanel生成一个带有网格模式的板,其中包含在javaFX中保存方形对象的节点。以下是电流输出:

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

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

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);
        }
    }
}
导入javafx.application.application;
导入javafx.scene.Group;
导入javafx.scene.scene;
导入javafx.scene.layout.StackPane;
导入javafx.scene.paint.Color;
导入javafx.scene.shape.Rectangle;
导入javafx.stage.stage;
公共类MainApp扩展应用程序{
专用最终双窗宽度=1000;
专用最终双窗高度=1000;
/*n是每行的单元数
m是每列的单元数*/
私人最终整数n=50;
私人最终int m=50;
双网格宽度=窗宽/n;
双网格高度=窗高/m;
MyNode[][]playfield=新的MyNode[n][m];
公共静态void main(字符串[]args){
发射(args);
}
@凌驾
公共无效开始(阶段primaryStage){
组根=新组();
//初始化操场
对于(int i=0;i
您可以将鼠标事件处理程序添加到根目录:

  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->mousepressedonode(e)),向每个
MyNode
实例添加鼠标事件处理程序到它的构造函数

并添加以下方法:

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

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

如果在鼠标单击时设置
处理程序,则可以直接或通过查询
MouseEvent
获取坐标,但它返回的是实际屏幕的坐标,而不是我当前选择的节点。请参阅我的编辑。我不确定你到底需要什么,你可能想看看