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