【问题标题】:set alignment of a pane in a stack pane在堆栈窗格中设置窗格的对齐方式
【发布时间】:2018-04-23 18:57:21
【问题描述】:

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

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

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

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 是我的内部类)

这是我得到的:

【问题讨论】:

  • 不要使用StackPane。使用BorderPaneVBoxesHBoxes
  • AnchorPane 或许也能满足您的需求。
  • 如果你的Scene布局是静态的,我建议你使用SceneBuilder
  • 我认为正在发生的事情是该窗格只是在缩放之前填充了整个堆栈窗格。转换在布局之后应用,因此小窗格填充整个堆栈窗格,然后缩放 25%,并围绕其中心应用缩放。因此,缩放的窗格显示为居中。尝试将小窗格包装在 Group 中,将组添加到堆栈窗格而不是直接添加小窗格,并在组上设置对齐方式。 (如果您发布我们可以测试的实际minimal reproducible example,我可以在答案中准确说明。)

标签: java javafx javafx-8


【解决方案1】:

将缩放的窗格放置在组内。出于布局目的,StackPane(和其他布局窗格)将忽略节点上的比例因子和其他转换,但 Group 不会。

来自Group javadoc

应用于组的任何变换、效果或状态都将应用于该组的所有子项。此类变换和效果不会包含在此 Group 的布局边界中,但是如果直接在此 Group 的子级上设置变换和效果,则它们将包含在此 Group 的布局边界中。


示例应用

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

【讨论】:

    猜你喜欢
    • 2019-10-25
    • 1970-01-01
    • 2021-10-23
    • 2014-09-17
    • 2023-03-04
    • 2021-04-06
    • 2020-08-18
    • 1970-01-01
    • 2015-07-29
    相关资源
    最近更新 更多