需要在整个区域

时间:2017-11-03 08:53:43

标签: javafx javafx-8 javafx-2 javafxports javafx-3d

我有以下代码,它遍历我的模型列表而不是创建 区域中的节点

        final AtomicDouble x = new AtomicDouble(0.0);
        final AtomicDouble y = new AtomicDouble(0.0);
        bottomAnchorPane.getChildren().clear();
        modelSet.getModels().stream().forEach(model -> {
            final DraggableNode node = new DraggableNode();
            node.setType(DragIconType.MODEL);
            node.setTitle(model.getName());
            bottomAnchorPane.getChildren().add(node);
            node.relocateToPoint(new Point2D(x.get(), y.get()));
            x.addAndGet(10 + Math.random() * (50 - 10));
            y.addAndGet(20 + Math.random() * (300 - 50));
        });

public class DraggableNode extends AnchorPane {

   public void relocateToPoint(final Point2D p) {
        final Point2D localCoords = getParent().sceneToLocal(p);
        relocate((int) (localCoords.getX() - dragOffset.getX()),
                (int) (localCoords.getY() - dragOffset.getY()));
    }
}

现在看来如下。我想将它均匀地分布在整个区域。 enter image description here

node.relocateToPoint(new Point2D(x.get(), y.get())); 

是这里的关键,它采用节点位置x,y,但不知怎的,我的随机化效果不好。有没有更好的方法。

1 个答案:

答案 0 :(得分:0)

以下是如何在随机位置重新定位节点的示例:

import javafx.application.Application;
import javafx.collections.ObservableList;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.BorderPane;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class RandomRelocateTest extends Application {

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

    @Override
    public void start(Stage primaryStage) throws Exception {

        BorderPane box = new BorderPane();

        AnchorPane mainPane = new AnchorPane();

        addPanes(mainPane);

        Button button = new Button("Randomize Location");
        button.setOnAction(e -> {
            randomizeLoc(mainPane);
        });

        box.setCenter(mainPane);
        box.setBottom(button);

        Scene scene = new Scene(box, 550, 450);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    // Add 15 rectangle to a specific location
    private void addPanes(AnchorPane mainPane) {
        for (int i = 0; i < 15; i++) {
            Rectangle rec = new Rectangle();
            rec.setStyle("-fx-border-color: black");
            rec.setWidth(20);
            rec.setHeight(20);

            rec.relocate(50 + 20 * i + 5 * i, 10);

            mainPane.getChildren().add(rec);
        }
    }

    private void randomizeLoc(AnchorPane mainPane) {

        double myMargins = 30;
        double rectangleSize = 20;

        double paneWidth = mainPane.getWidth() - myMargins - rectangleSize;
        double paneHeight = mainPane.getHeight() - myMargins - rectangleSize;

        // Get all the Nodes inside the AnchorPane
        ObservableList<Node> childrens = mainPane.getChildren();
        for (Node n : childrens) {

            double x = myMargins + Math.random() * (paneWidth);
            double y = myMargins + Math.random() * (paneHeight);

            n.relocate(x, y);
        }
    }
}

看看randomizeLoc(),我将添加一些图片来解释我的计算逻辑。

enter image description here

编辑:上面有一个AnchorPane的例子。实际尺寸是填充矩形,我们想要绘制Object的区域是Dotted Rectangle。现在,Math.random将为您提供介于0.0和1.0之间的数字。首先,我们要确保我们位于虚线区域内,因此左上角位于(20,20)(如果我们设置marginValue = 20),右下角位于(宽度-20,高度 - 20)。因此,如果我们想要完全位于虚线区域内,我们需要设置X和y,如:

x = 20 + Math.random() * (width-20);
y = 20 + Math.random() * (height-20);

不幸的是,如果我们从Math.random()获得1.0(或接近1.0),这意味着矩形的开始将在x,y =(width-20,height-20)和矩形大小为20x20,因此矩形(或其中的一部分,取决于random()的值)将在虚线区域之外。所以我们需要从宽度和高度中减去实际的矩形大小。因此我们需要:

x = 20 + Math.random() * (width -20 - 20); // if we say the rect is 20x20
y = 20 + Math.random() * (height -20 - 20);

所以我们的区域现在是用虚线减去的虚线区域。