Estoy tratando de habilitar el arrastre de un panel en mi aplicación java fx usando este código:

setOnMouseDragged(event -> {
            setManaged(false);
            this.setTranslateX(event.getX()-120);
            this.setTranslateY(event.getY()-50);
            event.consume();

        });

Pero cuando trato de arrastrarlo, se arrastra pero también aparece en otro lugar cada pocos fotogramas, por lo que parece que está en dos lugares, cuando suelto el panel, termina en uno de estos lugares. ¿Alguien sabe por qué no funciona?

0
tommy 14 dic. 2016 a las 23:46

2 respuestas

La mejor respuesta

Las coordenadas proporcionadas por MouseEvent se proporcionan en coordenadas locales. Si modifica las propiedades de translate, la posición del objeto se modifica y el sistema de coordenadas local de origen también se mueve.

Esto significa que disminuir una propiedad de traducción aumentará la coordenada del mouse correspondiente en el mismo valor. Al aumentar la propiedad de traducción, disminuirá la coordenada del mouse correspondiente en el próximo evento. Esto hace que el nodo salte.

Las posibles soluciones son usar coordenadas en el padre u otra coordenada no influenciada por la propiedad de traducción o teniendo en cuenta la propiedad de traducción actual:

setOnMouseDragged(event -> {
    setManaged(false);
    this.setTranslateX(event.getX() + this.getTranslateX() - 120);
    this.setTranslateY(event.getY() + this.getTranslateY() - 50);
    event.consume();
});

Tenga en cuenta que codificar las compensaciones hace que el nodo salte en el primer evento, pero no en los eventos consecutivos.

1
fabian 14 dic. 2016 a las 21:12

Creo que esta pregunta ya tiene una respuesta aquí Arrastra, pero para realizar eso, necesitas dos eventos (Press Drag) el primero para decirle a la ventana desde dónde ha comenzado el arrastre y el segundo para realizar el arrastre en sí.

-2
Community 23 may. 2017 a las 11:53