JavaFX将事件侦听器附加到黑色圆圈
说到Java,我完全是个新手,但我正在尝试构建一个跳棋游戏。我已经建立了一个董事会,但我很困惑,究竟如何以及在哪里最好地添加某种类型的事件监听器,鼠标悬停和点击 我使用了Groovy和JavaFX的组合,Groovy是因为我喜欢它的语法,JavaFX是因为它似乎是Swing更好的选择JavaFX将事件侦听器附加到黑色圆圈,java,groovy,javafx,java-8,javafx-8,Java,Groovy,Javafx,Java 8,Javafx 8,说到Java,我完全是个新手,但我正在尝试构建一个跳棋游戏。我已经建立了一个董事会,但我很困惑,究竟如何以及在哪里最好地添加某种类型的事件监听器,鼠标悬停和点击 我使用了Groovy和JavaFX的组合,Groovy是因为我喜欢它的语法,JavaFX是因为它似乎是Swing更好的选择 class Window extends Application { private int boardSize = 8 private int squareSize = 60 void
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)
}
}
类窗口扩展应用程序{
专用int boardSize=8
私有整数平方大小=60
无效开始(阶段primaryStage){
初级阶段设置标题(“草图”)
GridPane棋盘=新建GridPane()
棋盘格.设置填充(新插图(10,10,10,10))
配置板规格(棋盘格)
布局板(棋盘格)
BorderPane根=新的BorderPane(棋盘格);
原始阶段。设置场景(新场景(根,500500))
primaryStage.show()
}
专用void布局板(def棋盘){
def fill=Color.WHITE
用于(0..boardSize-1中的行){
用于(0..boardSize-1中的列){
如果((行+列)%2){
填充=Color.SADDLEBROWN
}否则{
fill=Color.PERU
}
棋盘格。添加(新矩形(方形、方形、填充)、列、行)
如果(行%2!=列%2){
如果(第3行){
棋盘格。添加(新圆圈(正方形/2-4,颜色。白色),列,行)
}否则,如果(第4行){
棋盘格。添加(新圆圈(正方形/2-4,颜色。黑色),列,行)
}
}
}
}
}
专用void配置板规格(def板){
用于(i在0..boardSize-1中){
RowConstraints RowConstraints=新的RowConstraints()
rowConstraints.setMinHeight(squareSize)
rowConstraints.setPrefHeight(squareSize)
rowConstraints.setMaxHeight(squareSize)
rowConstraints.setValignment(VPos.CENTER)
board.getRowConstraints().add(rowConstraints)
ColumnConstraints colConstraints=新ColumnConstraints()
colConstraints.setMinWidth(squareSize)
colConstraints.setMaxWidth(squareSize)
colConstraints.setPrefWidth(squareSize)
colConstraints.setHalignment(HPos.CENTER)
board.getColumnConstraints().add(colConstraints)
}
}
在jQuery中,我更习惯于这样做,我会使用选择器抓取任何一种黑色的圆,当鼠标光标悬停在上面时,它会给圆添加一个边框。然后单击,整个圆或包围矩形的颜色会改变
关于这方面的最佳方法,有什么有用的建议吗
非常感谢,您需要在创建圆时创建对圆的引用,以便可以添加侦听器。例如(注意:我使用Java,而不是Groovy,因此语法可能不匹配,但这会让您了解):
我设法按照我提议的方式做到了:
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);
}
})
}
}
children=checkboard.getChildren()
用于(儿童中的儿童){
if(圆的子实例){
setOnMouseCentered(新的EventHandler(){
@凌驾
无效句柄(MouseEvent事件){
child.setStroke(橙色);
}
})
}
}
然而@James_D answer似乎更好一些如果我的问题有什么你不喜欢的地方,请评论一下。干杯,你的建议其实很简单。我按照我的想法做了,但似乎没有那么雄辩。顺便问一下,你知道如何在一个处理程序中批量分配鼠标事件吗?不确定你说的另一个问题是什么意思。
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);
}
})
}
}