Javafx устанавливает проблемы масштаба при расширении группы путем перетаскивания прямоугольника в группе - PullRequest
0 голосов
/ 27 мая 2018

У меня проблема с масштабированием группы, содержащей фигуры, и перетаскиванием фигур вокруг.

В приведенном ниже примере у меня есть группа, содержащая 2 прямоугольника, после масштабирования группы, если я перетаскиваю одну изпрямоугольники, другой станет отрицательным на расстоянии другого, т. е. если я перетащу прямоугольник r2 вниз, прямоугольник увеличится и т. д.

Мне интересно, если это какая-то ошибка, илив чем проблема?

Приведенный ниже код является рабочим примером моей проблемы.

ПРИМЕЧАНИЕ. Я выполнил тест на границах, и он меняется только при перемещении перетаскиваемого прямоугольника.за пределами текущих границ.

при перемещении в нижний правый угол новые границы будут похожи на

BoundingBox [minX:250.0, minY:250.0, minZ:0.0, width:301.7606201171875, height:338.6553955078125, depth:0.0, maxX:551.7606201171875, maxY:588.6553955078125, maxZ:0.0]

, хотя другой прямоугольник выходит за пределы minX и minYграницы.

import javafx.scene.shape.Rectangle;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class SampleScale extends Application {

    @Override
    public void start(Stage primaryStage) {

        Group g = new Group();

        Rectangle r = new Rectangle(250,250,10,10);
        Rectangle r2 = new Rectangle(260,260,10,10);

        r2.setFill(Color.RED);
        r2.setOnMouseDragged(event
                ->
        {
            r2.setTranslateX(r2.getTranslateX() + (event.getX() -r2.getX()));
            r2.setTranslateY(r2.getTranslateY() + (event.getY() -r2.getY()));
            g.autosize();
            event.consume();
        });

        Pane p = new Pane();

        p.setPrefSize(1000, 1000);
        g.getChildren().addAll(r,r2);
        p.getChildren().addAll(g);// comment out to test bottom code;


        //default works
        //g.setScaleX(1);
        //g.setScaleY(1);

        //causes other node to move negative distance of the other object
        // i.e., if r2 is dragged down, r will move up, etc.
        g.setScaleX(2);
        g.setScaleY(2);

        //-------------------------

        //this works if not placed inside a group


        //    p.getChildren().addAll(r,r2);
        //   r.setScaleX(2);
        //    r.setScaleY(2);
        // r2.setScaleX(2);
        //   r2.setScaleY(2);


        Scene scene = new Scene(p, 1300, 1250);
        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
    * @param args the command line arguments
    */
    public static void main(String[] args) {
        launch(args);
    }

}

1 Ответ

0 голосов
/ 27 мая 2018

Свойства scaleX и scaleY используют центр узла в качестве точки поворота для масштабирования.Поскольку перемещение r2 изменяет размер Group, остальные дети также перемещаются.

Вместо этого можно применить преобразование Scale с точкой поворота (0, 0):

// g.setScaleX(2);
// g.setScaleY(2);
g.getTransforms().add(new Scale(2, 2, 0, 0));
...