java - 设置堆栈 Pane 中 Pane 的对齐方式

标签 java javafx javafx-8

我尝试创建一个在堆栈 Pane 中包含 2 个 Pane 的应用程序。 一个 Pane 是主 Pane 并居中,第二个 Pane 较小并停靠在舞台的左下角。

问题是我试过使用“setAlignment”但它似乎不起作用(尽管按钮已对齐)。 小 Pane 始终居中。

问题是什么,我该如何解决? 我想也许我无法对齐 Pane ,那么我该如何克服呢?

Pane pane = new Pane();

for (SerialPoint sp : points) {
    Circle circle = new Circle(sp.getX(), sp.getY(), 6, Color.GREEN);
    pane.getChildren().add(circle);
}

Pane smallPane = new Pane();
smallPane.setScaleX(0.25);
smallPane.setScaleY(0.25);
smallPane.setStyle("-fx-border-color: black;");

for (SerialPoint sp : points) {
    Circle circle = new Circle(sp.getX(), sp.getY(), 6, Color.RED);
    smallPane.getChildren().add(circle);
}

Button startBtn = new Button("Start");

StackPane stackPane = new StackPane(pane, smallPane, startBtn);
StackPane.setAlignment(smallPane, Pos.BOTTOM_LEFT);
StackPane.setAlignment(startBtn, Pos.TOP_RIGHT);
StackPane.setMargin(startBtn, new Insets(5));

Scene scene = new Scene(stackPane);

(SerialPoint 是我的内部类)

这是我得到的:enter image description here

最佳答案

将缩放的 Pane 放在一个组中。出于布局目的,StackPane(和其他布局 Pane )将忽略节点上的比例因子和其他变换,但组不会。

来自Group javadoc :

Any transform, effect, or state applied to a Group will be applied to all children of that group. Such transforms and effects will NOT be included in this Group's layout bounds, however if transforms and effects are set directly on children of this Group, those will be included in this Group's layout bounds.


示例应用

sample

import javafx.application.Application;
import javafx.geometry.*;
import javafx.scene.*;
import javafx.scene.control.Button;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;

import java.util.Random;

public class AligningPains extends Application {

    private static final int N_POINTS = 5;
    private static final int MAX_POINT_POS = 100;
    private static final int POINT_RADIUS = 6;
    private static final int PREF_PANE_SIZE = 300;
    private static final int BUTTON_INSETS = 5;

    Point2D[] points = new Point2D[N_POINTS];
    Random random = new Random(42);

    @Override
    public void start(Stage stage) {
        initPoints();

        Pane pane = new Pane();
        pane.setPrefSize(PREF_PANE_SIZE, PREF_PANE_SIZE);

        addCircles(pane, Color.GREEN);

        Pane smallPane = new Pane();
        smallPane.setStyle("-fx-border-color: black;");
        smallPane.setPrefSize(PREF_PANE_SIZE, PREF_PANE_SIZE);
        smallPane.setScaleX(0.25);
        smallPane.setScaleY(0.25);

        addCircles(smallPane, Color.RED);

        Group smallGroup = new Group(smallPane);

        Button startBtn = new Button("Start");

        StackPane stackPane = new StackPane(pane, smallGroup, startBtn);
        StackPane.setAlignment(smallGroup, Pos.BOTTOM_LEFT);
        StackPane.setAlignment(startBtn, Pos.TOP_RIGHT);
        StackPane.setMargin(startBtn, new Insets(BUTTON_INSETS));
        stackPane.setPrefSize(PREF_PANE_SIZE, PREF_PANE_SIZE);

        Scene scene = new Scene(stackPane);
        stage.setScene(scene);
        stage.show();
    }

    private void addCircles(Pane pane, Color color) {
        for (Point2D sp : points) {
            Circle circle = new Circle(sp.getX(), sp.getY(), POINT_RADIUS, color);
            pane.getChildren().add(circle);
        }
    }

    private void initPoints() {
        for (int i = 0; i < points.length; i++) {
            points[i] = new Point2D(random.nextInt(MAX_POINT_POS), random.nextInt(MAX_POINT_POS));
        }
    }

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

关于java - 设置堆栈 Pane 中 Pane 的对齐方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49988109/

相关文章:

image - 通过代码在ImageView中加载图片

java - 如何启用或禁用JavaFX表单中的按钮?

java - 无法使用 Ant 构建 JavaFX 应用程序

java - 有人可以解释.wav(WAVE)文件头吗?

java - string.tolowercase 在小写字符串上的表现

java - 具有字典和空指针的作用域

java - 是否可以将 JavaFX 的 PerspectiveTransform 与新的 Canvas 类一起使用?

java - 如何使用比较器比较空值?

java - Android:闲置 X 分钟后重新打开应用程序?

java - 如何在给定形状中旋转 LinearGradient?