Le dessin d'un rectangle dans toutes les directions avec JavaFX échoue


J'utilise ce code pour dessiner un rectangle tout en faisant glisser la souris. Le problème est que je ne peux dessiner que de gauche à droite.

Voici mon code:

public class functionalTest extends Application {

    BorderPane pane;
    Rectangle rect;
    Group group;
    SimpleDoubleProperty rectinitX = new SimpleDoubleProperty();
    SimpleDoubleProperty rectinitY = new SimpleDoubleProperty();
    SimpleDoubleProperty rectX = new SimpleDoubleProperty();
    SimpleDoubleProperty rectY = new SimpleDoubleProperty();


    @Override
    public void start(Stage stage) {


        pane = new BorderPane();
        Scene scene = new Scene(pane, 800, 600);
        stage.setScene(scene);

        group = new Group();
        Circle circle = new Circle(200, 200, 25);
        circle.setFill(Color.HOTPINK);
        group.getChildren().add(circle);

        scene.setOnMouseDragged(mouseHandler);
        scene.setOnMousePressed(mouseHandler);
        scene.setOnMouseReleased(mouseHandler);

        rect = getNewRectangle();
        rect.widthProperty().bind(rectX.subtract(rectinitX));
        rect.heightProperty().bind(rectY.subtract(rectinitY));
        pane.getChildren().add(rect);
        pane.getChildren().add(group);
        stage.show();

        ArrayList<Node> containedNodesArray = new ArrayList<Node>();
        containedNodesArray = Main.dragBoxSelection(group, rect);

        if (containedNodesArray.size() > 0) {
            System.out.println("Success");
        }
    }

    EventHandler<MouseEvent> mouseHandler = new EventHandler<MouseEvent>() {

        @Override
        public void handle(MouseEvent mouseEvent) {

            if (mouseEvent.getEventType() == MouseEvent.MOUSE_PRESSED) {
                rect.setX(mouseEvent.getX());
                rect.setY(mouseEvent.getY());
                rectinitX.set(mouseEvent.getX());
                rectinitY.set(mouseEvent.getY());
            } else if (mouseEvent.getEventType() == MouseEvent.MOUSE_DRAGGED) {
                rectX.set(mouseEvent.getX());
                rectY.set(mouseEvent.getY());
                System.out.println("RECTX"+rectX.getValue());
                System.out.println("RECTY"+rectY.getValue());
                ArrayList<Node> containedNodesArray = new ArrayList<Node>();
                containedNodesArray = Main.dragBoxSelection(group, rect);

                if (containedNodesArray.size() > 0) {
                    System.out.println("Success");
                }
            } else if (mouseEvent.getEventType() == MouseEvent.MOUSE_RELEASED) {
                // Clone the rectangle
                Rectangle r = getNewRectangle();
                r.setX(rect.getX());
                r.setY(rect.getY());
                r.setWidth(rect.getWidth());
                r.setHeight(rect.getHeight());
                pane.getChildren().add(r);

                // Hide the rectangle
                rectX.set(0);
                rectY.set(0);
            }
        }


    };

    private Rectangle getNewRectangle() {
        Rectangle r = new Rectangle();
        r.setFill(Color.web("blue", 0.1));
        r.setStroke(Color.BLUE);

        return r;
    }

    public static void main(String[] args) {
        launch(args);
    }
}

Quelqu'un peut-il m'aider à dessiner d'autres directions de droite à gauche, de gauche à droite et de droite à gauche.

Author: BlackBear, 2013-07-06

4 answers

Voici ce que vous devez faire:

Lorsque la souris est déplacée: obtenir le dx = mouseEvent.getX() - initial X; if dx < 0, alors vous devez setTranslateX(dx) et setWidth(-dx) else setTranslateX(0) et setWidth(dx)

Faites de même pour la coordonnée Y, mais cette fois, utilisez la hauteur et non la largeur;

C'est tout.

 1
Author: marcelo6297, 2014-11-20 10:25:49

J'ai remplacé le code pour être comme ceci: EventHandler mouseHandler = new EventHandler () {

    @Override
    public void handle(MouseEvent mouseEvent) {

        if (mouseEvent.getEventType() == MouseEvent.MOUSE_PRESSED) {
            rectinitX.set(mouseEvent.getX());
            rectinitY.set(mouseEvent.getY());
        } else if (mouseEvent.getEventType() == MouseEvent.MOUSE_DRAGGED) {
            Double width = mouseEvent.getX() - rectinitX.getValue();
            if (width < 0) {
                rectX.set(mouseEvent.getX());
                rect.setTranslateX(width);
                rect.widthProperty().bind(rectinitX.subtract(rectX));
                System.out.println(rect.getWidth());
            } else {
                rectX.set(mouseEvent.getX());
                rect.setTranslateX(0);
                rect.widthProperty().bind(rectX.subtract(rectinitX));
            }

        } else if (mouseEvent.getEventType() == MouseEvent.MOUSE_RELEASED) {
            // Clone the rectangle
            Rectangle r = getNewRectangle();
            r.setX(rect.getX());
            r.setY(rect.getY());
            r.setWidth(rect.getWidth());
            r.setHeight(rect.getHeight());
            pane.getChildren().add(r);


        }
    }
};

Je voulais seulement essayer votre solution pour les vaues de largeur au début mais cela ne semble pas fonctionner. Avez - vous des commentaires sur ma mise en œuvre?

 0
Author: MaryamB, 2013-07-07 19:08:45

Il vous manque les paramètres de hauteur.

            if (event.getEventType() == MouseEvent.MOUSE_PRESSED) {
            rect.setX(event.getX());
            rect.setY(event.getY());
            rectinitX.set(event.getX());
            rectinitY.set(event.getY());
        } else if (event.getEventType() == MouseEvent.MOUSE_DRAGGED) {
            Double dx = event.getX() - rectinitX.getValue();
            Double dy = event.getY() - rectinitY.getValue();
            if (dx < 0) {
                rectX.set(event.getX());
                rect.setTranslateX(dx);
                rect.widthProperty().bind(rectinitX.subtract(rectX));
            } else {
                rectX.set(event.getX());
                rect.setTranslateX(0);
                rect.widthProperty().bind(rectX.subtract(rectinitX));
            }
            if(dy < 0) {
                rectY.set(event.getY());
                rect.setTranslateY(dy);
                rect.heightProperty().bind(rectinitX.subtract(rectX));
            } else {
                rectY.set(event.getY());
                rect.setTranslateY(0);
                rect.heightProperty().bind(rectY.subtract(rectinitY));
            }

        } else if (event.getEventType() == MouseEvent.MOUSE_RELEASED) {
            // Clone the rectangle
            Rectangle r = getNewRectangle();
            r.setX(rect.getX());
            r.setY(rect.getY());
            r.setWidth(rect.getWidth());
            r.setHeight(rect.getHeight());
            pane.getChildren().add(r);

            // Hide the rectangle
            rectX.set(0);
            rectY.set(0);
  }}}};

C'est le code exact pour dessiner dans différentes directions sauf que ne fonctionne pas malheureusement de gauche en bas à droite en haut et je ne peux pas le comprendre. Fonctionne parfaitement par défaut aka de gauche à droite mais il y a un bug de code lors du dessin de droite à gauche. Si quelqu'un pouvait le comprendre, Ill être beaucoup appricated

 0
Author: realmean, 2014-11-15 11:02:12

Il devrait lire

 if(dy < 0)
 {
   rectY.set(mouseEvent.getY());
   rect.setTranslateY(dy);
   rect.heightProperty().bind(rectinitY.subtract(rectY));
 }
 0
Author: Andres Acosta, 2017-08-08 18:20:33