Я пытаюсь реализовать игру в шахматы. Плата GUI является сеткой стековых панелей (класс Square). части являются imageViews на стеках. Когда на фигуре обнаружено перетаскивание, начинается полное перетаскивание. когда перетаскивание отпущено, предполагается, что оно отправляет событие mouseDragReleased в stackPane под мышью в точке выпуска. Но вместо этого событие отправляется в исходную стек-панель, где начинается фрагмент. Я искал везде и не могу найти решение. Где ошибка?
public class Square extends StackPane {
private final int rank;
private final char file;
public Square(int colorType, int rank, char file) {
super();
Color color;
if (colorType == 0)
color = Color.DARKGREEN;
else
color = Color.BEIGE;
this.rank = rank;
this.file = file;
this.setPrefSize(60, 60);
this.setBackground(new Background(new BackgroundFill(color, CornerRadii.EMPTY, Insets.EMPTY)));
this.setBorder(new Border(new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID, CornerRadii.EMPTY, new BorderWidths(1))));
setMouseEventHandlers();
}
public void initializePieceImage(ChessPiece piece) {
if (piece != null) {
PieceImageView pieceImageView = new PieceImageView(piece.getColor(), SwingFXUtils.toFXImage(piece.getImage(), null), piece.getRank(), piece.getFile());
this.getChildren().clear();
this.getChildren().add(pieceImageView);
}
}
private void setMouseEventHandlers() {
this.setOnMouseDragReleased(((MouseDragEvent event) -> {
PieceImageView newPieceImageView = (PieceImageView) event.getGestureSource();
if (ChessGame.movePiece(newPieceImageView.getRank(), newPieceImageView.getFile(), this.getRank(), this.getFile())) { // move legality check
this.getChildren().clear();
newPieceImageView.setFile(this.getFile());
newPieceImageView.setRank(this.getRank());
Square oldSquare = (Square) newPieceImageView.getParent();
this.getChildren().add(newPieceImageView);
}
}));
}
public class PieceImageView extends ImageView {
private final PlayerColor color;
private int rank;
private char file;
private double startDragX;
private double startDragY;
public PieceImageView(PlayerColor color, Image image, int rank, char file) {
super(image);
this.color = color;
this.rank = rank;
this.file = file;
if (color.equals(ChessGame.getPlayerColor()))
setMouseEventHandlers();
}
private void setMouseEventHandlers() {
this.setOnMousePressed((MouseEvent event) -> {
this.setMouseTransparent(true);
});
this.setOnMouseReleased((MouseEvent event) -> {
this.setMouseTransparent(false);
});
this.setOnDragDetected((MouseEvent event) -> {
startDragX = event.getSceneX();
startDragY = event.getSceneY();
this.getParent().toFront();
this.startFullDrag();
});
this.setOnMouseDragged((MouseEvent event) -> {
this.setTranslateX(event.getSceneX() - startDragX);
this.setTranslateY(event.getSceneY() - startDragY);
});
}