我在几周前在这里发了一个问题,为制作国际象棋游戏提供了一些帮助,我收到了很好的回复,还有一些代码可以解决我的问题。我一直试图剖析代码并研究它,以便我能更好地理解它的工作原理。在这样做时,我遇到了一个似乎无法找到答案的问题。棋盘由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);
}
}
答案 0 :(得分:1)
变化:
StackPane root = new StackPane(board,piecePane);
为:
StackPane root = new StackPane(piecePane,board);
?
由于board
落后于piecePane
,因此无法接收事件。
在使用全局变量 col
和row
之前,这些变量的值始终与7
和7
相同。运行循环那些改变其值的变量,但最后它们具有值7
7
,这里我们需要使用局部变量 col
和{ {1}},因此您需要添加此修改:
row
答案 1 :(得分:0)
我自己在JavaFX中没有多少工作,尽管它与基于&#34;碰撞&#34;的java swing非常相似。
有一个rectangle类,其中包含方法contains
和intersects
。如果您使用MouseEvent来了解鼠标坐标以及何时单击鼠标。你可以这样做:
if(mouse.isClicked() && rect.contains(mouse.x, mouse.y) { // do stuff }
您需要为所有方块创建矩形对象。希望它成功。
编辑:注意Regions还包含方法contains
和intersects
- 事先尝试这些方法,只有在必须跳过太多对象时才使用矩形