我正在制作跳棋游戏。 3 个主要组件是 Board 类、BoardPiece 和 GamePiece。所有 GamePiece 对象本质上对鼠标都是不可见的。当单击棋盘 block 时,将执行检查以查看棋盘 block 上当前是否有游戏 block 。因此,一旦单击 BoardPiece 并找到一 block ,该 block 就需要处理事件(用于拖放)。以下是 BoardPiece 类的摘录:
setOnMousePressed(e -> {
if (e.getTarget() instanceof BoardPiece) {
BoardPiece bp = (BoardPiece)e.getTarget();
GamePiece p = bp.getPiece();
if (p != null) {
p.fireEvent(e);
}
}
});
setOnMouseDragged(e -> {
if (e.getTarget() instanceof BoardPiece) {
BoardPiece bp = (BoardPiece)e.getTarget();
GamePiece p = bp.getPiece();
if (p != null) {
p.fireEvent(e);
}
}
});
setOnMouseReleased(e -> {
if (e.getTarget() instanceof BoardPiece) {
BoardPiece bp = (BoardPiece)e.getTarget();
GamePiece p = bp.getPiece();
if (p != null) {
p.fireEvent(e);
}
}
});
如您所见,我必须手动告诉该部分处理每个事件,而不是整个事件链。我对 JavaFX 和一般的 Java 比较陌生,所以我主要关心学习最有效的做事方式。
最佳答案
您必须单独设置所有事件处理程序,但由于每个处理程序都具有相同的功能,因此您可以简化:
EventHandler<? super MouseEvent> mouseEventHanlder = e -> {
if (e.getTarget() instanceof BoardPiece) {
BoardPiece bp = (BoardPiece)e.getTarget();
GamePiece p = bp.getPiece();
if (p != null) {
p.fireEvent(e);
}
}
};
setOnMousePressed(mouseEventHanlder);
setOnMouseDragged(mouseEventHanlder);
setOnMouseReleased(mouseEventHanlder);
关于JavaFX 构建新的事件链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34211521/