对于Java而言,我是一个新手,但我正试图建立一个跳棋游戏。我已经构建了一个电路板,但我确切地知道如何以及最好地添加某种事件监听器以便鼠标悬停和点击。
我使用了Groovy和JavaFX,Groovy的组合,因为我喜欢语法和JavaFX,因为它似乎是Swing的更好替代品。
class Window extends Application {
private int boardSize = 8
private int squareSize = 60
void start(Stage primaryStage) {
primaryStage.setTitle("Draughts")
GridPane checkerBoard = new GridPane()
checkerBoard.setPadding(new Insets(10,10,10,10))
configureBoardSpecs(checkerBoard)
layoutBoard(checkerBoard)
BorderPane root = new BorderPane(checkerBoard);
primaryStage.setScene(new Scene(root, 500, 500))
primaryStage.show()
}
private void layoutBoard(def checkerBoard) {
def fill = Color.WHITE
for (row in 0..boardSize-1) {
for (col in 0..boardSize-1) {
if ((row+col)%2) {
fill = Color.SADDLEBROWN
} else {
fill = Color.PERU
}
checkerBoard.add(new Rectangle(squareSize, squareSize, fill), col, row)
if (row % 2 != col % 2) {
if (row < 3) {
checkerBoard.add(new Circle(squareSize/2-4, Color.WHITE), col, row)
} else if (row > 4) {
checkerBoard.add(new Circle(squareSize/2-4, Color.BLACK), col, row)
}
}
}
}
}
private void configureBoardSpecs(def board) {
for (i in 0..boardSize-1) {
RowConstraints rowConstraints = new RowConstraints()
rowConstraints.setMinHeight(squareSize)
rowConstraints.setPrefHeight(squareSize)
rowConstraints.setMaxHeight(squareSize)
rowConstraints.setValignment(VPos.CENTER)
board.getRowConstraints().add(rowConstraints)
ColumnConstraints colConstraints = new ColumnConstraints()
colConstraints.setMinWidth(squareSize)
colConstraints.setMaxWidth(squareSize)
colConstraints.setPrefWidth(squareSize)
colConstraints.setHalignment(HPos.CENTER)
board.getColumnConstraints().add(colConstraints)
}
}
我更多地练习使用jQuery做这种事情,我会使用选择器抓住任何类型的黑色圆圈,并且当鼠标光标悬停在上面时,它会添加一个边框到了圈子。然后单击,整个圆或包围矩形的颜色将改变颜色。
关于最好的解决方法的任何有用的建议。
非常感谢,
答案 0 :(得分:1)
您需要在创建圈子时创建对圈子的引用,以便添加侦听器。例如(注意:我使用Java,而不是Groovy,因此语法可能不匹配,但是这会给你一个想法):
Circle circle = new Circle(squareSize/2-4, Color.WHITE) ;
circle.setOnMouseClicked(e -> {
// handler code...
});
checkerBoard.add(circle, col, row) ;
答案 1 :(得分:0)
我设法以我提议的方式做到了:
children = checkerBoard.getChildren()
for (child in children) {
if (child instanceof Circle) {
child.setOnMouseEntered(new EventHandler<MouseEvent>() {
@Override
void handle(MouseEvent event) {
child.setStroke(Color.ORANGE);
}
})
}
}
然而@James_D的回答似乎更好