gpt4 book ai didi

java - 保持 Gridpane 相同的高度和宽度(纵横比)

转载 作者:行者123 更新时间:2023-12-04 03:36:16 24 4
gpt4 key购买 nike

我有一个 javafx GridPane,当我调整舞台大小时,它会调整自身大小以适应舞台的尺寸。我希望网格 Pane 的高度与网格 Pane 的宽度相匹配,从而将大小调整为保持此约束的最大可能大小。
我不得不在 GridPane 的父级中添加更多元素。我发现添加的元素根本没有正常行为,并且相互重叠。
当然,当我删除覆盖方法时,它们停止重叠,但是当我重新调整舞台大小时,网格 Pane 不会保持完美的正方形。
我想尝试在后台使用图像/ ImageView 并应用 setPreserveRatio(true)为了它。然后将此图像的 heightProperty 绑定(bind)到 gridPane 的 prefHeightProperty,但由于某种原因,这也没有给我任何结果。
这是第二种方法的 MCVE,它不起作用,但如果我能以某种方式使其工作,那就太好了。

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class Main extends Application {

@Override
public void start(Stage primaryStage) {
StackPane stackPane = new StackPane();

Image image = new Image("Square Image.png", 300, 300, true, true);
ImageView imageView = new ImageView(image);
// This makes the image resize while maintaining its square shape...
imageView.fitHeightProperty().bind(stackPane.heightProperty());
imageView.fitWidthProperty().bind(stackPane.widthProperty());
imageView.setPreserveRatio(true);

GridPane gridPane = new GridPane();
for(int i=0; i<5; i++) {
for (int j = 0; j < 5; j++) {
Pane pane = new Pane();
pane.setPrefSize(100, 100);
gridPane.add(pane, i, j);
}
}
// Does not work as intended... :(
gridPane.prefWidthProperty().bind(imageView.fitWidthProperty());
gridPane.prefHeightProperty().bind(imageView.fitHeightProperty());

/*
Tried this as well, also does not work.. :(
gridPane.prefWidthProperty().bind(image.widthProperty());
gridPane.prefHeightProperty().bind(image.heightProperty());
*/


gridPane.setGridLinesVisible(true);

stackPane.getChildren().addAll(imageView, gridPane);
primaryStage.setScene(new Scene(stackPane));
primaryStage.show();
}

public static void main(String[] args) {
launch(args);
}
}
当然,所有这些方法都是试图完成这项工作的廉价 hacky 方法。如果有一种我不知道的标准方法,那么我想知道。

最佳答案

封装GridPaneStackPane并使用绑定(bind)动态更改GridPane child 喜欢的尺寸,同时保持纵横比:

import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.layout.*;
import javafx.stage.Stage;

public class Main extends Application {

private final int SIZE = 5;

@Override
public void start(Stage primaryStage) {

GridPane gridPane = new GridPane();
gridPane.setAlignment(Pos.CENTER);

StackPane centerPane = new StackPane(gridPane);
centerPane.setStyle("-fx-background-color:cyan");
centerPane.setPrefSize(SIZE*50, SIZE*50);

for(int i=0; i<SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
Pane pane = new Pane();
pane.setStyle("-fx-background-color:red");
gridPane.add(pane, i, j);
pane.prefWidthProperty().bind(Bindings.min(centerPane.widthProperty().divide(SIZE),
centerPane.heightProperty().divide(SIZE)));
pane.prefHeightProperty().bind(Bindings.min(centerPane.widthProperty().divide(SIZE),
centerPane.heightProperty().divide(SIZE)));
}
}
gridPane.setGridLinesVisible(true);

primaryStage.setScene(new Scene(centerPane));
primaryStage.show();
}

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

enter image description here

关于java - 保持 Gridpane 相同的高度和宽度(纵横比),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66827855/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com