我有以下代码,它遍历我的模型列表而不是创建 区域中的节点
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()));
}
}
node.relocateToPoint(new Point2D(x.get(), y.get()));
是这里的关键,它采用节点位置x,y,但不知怎的,我的随机化效果不好。有没有更好的方法。
答案 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(),我将添加一些图片来解释我的计算逻辑。
编辑:上面有一个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);
所以我们的区域现在是用虚线减去的虚线区域。