Событие JavaFX MouseDragReleased не отправляется целевому узлу в fullDrag - PullRequest
0 голосов
/ 28 февраля 2020

Я пытаюсь реализовать игру в шахматы. Плата 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);
        });
    }

1 Ответ

0 голосов
/ 01 марта 2020

Я исправил проблему, добавив эту строку в конструктор Square:

this.setPickOnBounds(false);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...