将MouseListener分配给区域的{2}数组中的每个区域

时间:2016-11-10 21:36:11

标签: multidimensional-array javafx mouselistener

我在几周前在这里发了一个问题,为制作国际象棋游戏提供了一些帮助,我收到了很好的回复,还有一些代码可以解决我的问题。我一直试图剖析代码并研究它,以便我能更好地理解它的工作原理。在这样做时,我遇到了一个似乎无法找到答案的问题。棋盘由2d区域组成,我试图将MouseListener添加到2d数组中的每个Region,这样当按下Region时,它将打印出按下的Region的行和列。现在,当我按下屏幕上的一个正方形时,没有任何事情发生,我无法弄清楚为什么我的MouseListener无法正常工作。

 public class Main extends Application {
 GridPane root = new GridPane();
 final int size = 8;
 int col = 0;
 int row = 0; 

 @Override
 public void start(Stage primaryStage) {
    try {


        GridPane board = new GridPane();
        Region[][] fields = new Region[8][8];
        for (int i = 0; i < fields.length; i++) {
            Region[] flds = fields[i];
            for (int j = 0; j < flds.length; j++) {
                Region field = new Region();
                flds[j] = field;
                field.setBackground(new Background(new BackgroundFill((i + j) % 2 == 0 ? Color.WHITE : Color.LIGHTBLUE, CornerRadii.EMPTY, Insets.EMPTY)));

            }
            board.addRow(i, flds);
        }

        for (int i = 0; i < fields.length; i++) {
            col = i;
            for (int j = 0; j < fields[i].length; j++) {
                row = j;
                fields[i][j].setOnMouseClicked(e->{
                    System.out.println("Col:" + col + ", Row" + row);
                });
            }
        }

         // use 1/8 of the size of the Grid for each field
        RowConstraints rowConstraints = new RowConstraints();
        rowConstraints.setPercentHeight(100d / 8);
        ColumnConstraints columnConstraints = new ColumnConstraints();
        columnConstraints.setPercentWidth(100d / 8);

        for (int i = 0; i < 8; i++) {
            board.getColumnConstraints().add(columnConstraints);
            board.getRowConstraints().add(rowConstraints);
        }

        Pane piecePane = new Pane();
        StackPane root = new StackPane(board, piecePane);

       // NumberBinding boardSize = Bindings.min(root.widthProperty(), root.heightProperty());
        NumberBinding boardSize = Bindings.min(root.widthProperty(), root.heightProperty());

        // board size should be as large as possible but at most the min of the parent sizes
        board.setPrefSize(Double.MAX_VALUE, Double.MAX_VALUE);

        // same size for piecePane
        piecePane.setPrefSize(Double.MAX_VALUE, Double.MAX_VALUE);
        piecePane.maxWidthProperty().bind(boardSize);
        piecePane.maxHeightProperty().bind(boardSize);

        Scene scene = new Scene(root,400,400);
        primaryStage.setScene(scene);
        primaryStage.show();
    } catch(Exception e) {
        e.printStackTrace();
    }
}

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

2 个答案:

答案 0 :(得分:1)

变化:

StackPane root = new StackPane(board,piecePane);

为:

StackPane root = new StackPane(piecePane,board);

? 由于board落后于piecePane,因此无法接收事件。

在使用全局变量 colrow之前,这些变量的值始终与77相同。运行循环那些改变其值的变量,但最后它们具有值7 7,这里我们需要使用局部变量 col和{ {1}},因此您需要添加此修改:

row

答案 1 :(得分:0)

我自己在JavaFX中没有多少工作,尽管它与基于&#34;碰撞&#34;的java swing非常相似。

有一个rectangle类,其中包含方法containsintersects。如果您使用MouseEvent来了解鼠标坐标以及何时单击鼠标。你可以这样做:

if(mouse.isClicked() && rect.contains(mouse.x, mouse.y) { // do stuff }

您需要为所有方块创建矩形对象。希望它成功。

编辑:注意Regions还包含方法containsintersects - 事先尝试这些方法,只有在必须跳过太多对象时才使用矩形