【问题标题】:Javafx setscale problems when enlarging group by dragging rectangle in the group通过在组中拖动矩形来扩大组时的Javafx setscale问题
【发布时间】:2018-05-27 04:41:30
【问题描述】:

我在缩放包含形状的组和拖动形状时遇到问题。

在下面的示例中,我有一个包含 2 个矩形的组,在缩放组后,如果我拖动其中一个矩形,另一个将变为负数,即如果我向下拖动矩形 r2,矩形 r 会上升,等等

我想知道这是否是某种错误,或者这里有什么问题?

下面的代码是我的问题的一个工作示例。

注意:我对边界进行了测试,只有当拖动的矩形移出当前边界时它才会改变。

如果移动到右下角,新边界将类似于

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]

即使另一个矩形移动到minXminY 边界之外。

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);
    }

}

【问题讨论】:

    标签: java javafx-8 grouping scaling


    【解决方案1】:

    scaleXscaleY 属性使用节点的中心作为缩放的轴心点。由于移动 r2 会调整 Group 的大小,因此其他孩子也会移动。

    您可以应用带有枢轴点(0, 0)Scale 转换:

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

    【讨论】:

    • 这似乎工作得很好,非常感谢!我不能投票给你,因为我没有 15 个代表,但我接受了这个作为正确答案。当我得到一些代表时,我会支持你。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 2021-11-24
    • 2017-05-03
    • 1970-01-01
    • 2023-02-16
    • 2010-09-05
    相关资源
    最近更新 更多