使用鼠标在网格窗格中添加节点

时间:2019-05-20 11:42:30

标签: java javafx

我正在尝试做一个非常简单的棋盘游戏(卡尔卡松),但是我在图形界面上遇到了很多麻烦。问题是我不知道如何在鼠标单击与网格窗格的行和列之间建立联系。

给出第一个图块,它总是添加到100、100网格的位置。您不会在代码中看到它,但是如果相邻的对象为空,则为每个添加的图块添加一个白色图块,因此看起来像这样:

enter image description here

然后,要求玩家在x = 99 y = 100,x = 101 y = 100,x的位置采取合法行动(我们不控制作弊者,所以是的,这将是一场虚弱的游戏) = 100 y = 99,x = 100 y = 101。

但是当我使用play()方法单击那里时,e.getSceneX();方法返回像素位置,我需要一种将其转换为有效行索引的方法。因此,这正在发生:

enter image description here

这是控制台输出:

在100 100处添加的XCCCC // //始终由程序指定,始终相同 在391380中添加了MFFCF图块

在这种情况下,我单击了x = 100 y = 101网格,但是鼠标将像素391、380返回给我。

有什么主意吗?

这是我的代码的结构:

public final class GUI extends Application {

private Game _game;
private GridPane _visualBoard;

@Override
public void start(final Stage primaryStage) {
    // some stuff setting the gridpane, which will be inside a scrollpane and the scrollpane will be inside a borderpane which will alse have 2 additional VBoxes with the current turn information
    play();
    primaryStage.show();
}


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

public void play() {
    _visualBoard.setOnMousePressed((MouseEvent e) -> {
        double x = e.getSceneX();
        double y = e.getSceneY();
        _game.doMove(x, y);
    });
}

 public void insertTile(myTile r, int x, int y) {
    myVisualTile rV = new myVisualTile(r);
    _visualBoard.add(rV, x, y);
}

这是课堂游戏:

public class Game {

private GUI _gui;
private List<Player> _players; // An arraylist of players
private int _currentPlayer; // The index of the current player in the ArrayList
private Board _board; // The logical board, totally separeted from the gridpane
private tileStack _stack;

 public void doMove(double x, double y) {
    int ax = (int) x;
    int ay = (int) y;
    if (_stack.isEmpty()) {
        System.out.println("Game finnished");
        //stuff
    }
    else {
        myTile r = _stack.poll(); // takes the first tile of the stack
        _gui.insertTile(r, ax, ay);
    }
}

1 个答案:

答案 0 :(得分:0)

public void play() {
        _visualBoard.setOnMousePressed((MouseEvent e) -> {
            Node source = (Node)e.getTarget() ;
            Integer x = GridPane.getColumnIndex(source);
            Integer y = GridPane.getRowIndex(source);

            _game.doMove(x, y);
        });
}

实际上是可行的。谢谢大家!