JavaFX将事件侦听器附加到黑色圆圈

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

说到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)
        }
    }
类窗口扩展应用程序{
专用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);
                    }
                })
            }
        }