Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.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 - Fatal编程技术网

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

Java 使用鼠标在网格窗格中添加节点,java,javafx,Java,Javafx,我正在尝试做一个非常简单的棋盘游戏(Carcasonne),但是我在图形界面方面遇到了很多问题。问题是我看不到在鼠标点击和gridpane行和列之间建立关系的方法 第一个平铺是给定的,它总是添加到100100个网格窗格的位置。您在代码中看不到它,但对于添加的每个平铺,如果相邻部分为空,则会添加一个白色平铺,因此如下所示: 然后,玩家需要在x=99 y=100,x=101 y=100,x=100 y=99,x=100 y=101的位置进行合法移动(我们不控制作弊者,所以是的,这将是一场弱小的游戏

我正在尝试做一个非常简单的棋盘游戏(Carcasonne),但是我在图形界面方面遇到了很多问题。问题是我看不到在鼠标点击和gridpane行和列之间建立关系的方法

第一个平铺是给定的,它总是添加到100100个网格窗格的位置。您在代码中看不到它,但对于添加的每个平铺,如果相邻部分为空,则会添加一个白色平铺,因此如下所示:

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

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

这是控制台输出:

tile xccc在100处添加100//这总是由程序给出的,总是一样的 在391 380处添加瓷砖MFFCF

在本例中,我单击x=100Y=101网格窗格,但鼠标返回像素391380

有什么想法吗

这是我的代码结构:

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);
    }
}
公共类游戏{
私有图形用户界面;
私有列表_players;//玩家数组列表
private int _currentPlayer;//当前播放器在ArrayList中的索引
专用板_Board;//与网格窗格完全分离的逻辑板
私有tileStack_堆栈;
公共无效doMove(双x,双y){
int ax=(int)x;
int-ay=(int)y;
if(_stack.isEmpty()){
System.out.println(“游戏finnished”);
//东西
}
否则{
myTile r=_stack.poll();//获取堆栈的第一个tile
_insertTile(r,ax,ay);
}
}
这确实奏效了。谢谢大家


这确实有效。谢谢大家!

您尝试过
\u visualBoard.getRowIndex(节点)
\u visualBoard.getColumnIndex(节点)了吗
?还有,学习。在处理
JavaFX
组件时,这可能非常重要。我如何选择该节点?我猜你想让该节点成为焦点?也许你可以使用一些
CSS
技巧?我试着使用node soure=(node)event.getSource()选择单击的节点。但不起作用。如果我有办法知道单击了哪个节点,我就会知道网格窗格的位置。您是否尝试过
\u visualBoard.getRowIndex(节点)
\u visualBoard.getColumnIndex(节点)
?还有,学习。在处理
JavaFX
组件时,这可能非常重要。我如何选择该节点?我猜你想让该节点成为焦点?也许你可以使用一些
CSS
技巧?我试着使用node soure=(node)event.getSource()选择单击的节点。但不起作用。如果我有办法知道我单击了哪个节点,我就会知道网格窗格的位置
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);
        });
}