JavaFX:调整大小时调整窗格大小 window
JavaFX: Resizing Panes when resizing window
我正在尝试构建一个简单的 Java 项目,其中包含 6 个窗格(作为父级添加到 GridPane 布局)。一开始就得设置window大小,参考根布局的宽高才设法平分。
pane.setMinSize(root.getWidth()/3, root.getHeight()/2);
但我希望它们在我更改 window 的大小时调整大小(使用鼠标,现在它们获得固定大小)。
所以我的问题是,如何在 JavaFX 中完成此操作?如何使元素拉伸并填充布局的 layout/part 大小,然后在调整 window 大小时更改大小?
这是我的代码:
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
public class Main6 extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
GridPane root = new GridPane();
Scene scene = new Scene(root, 900, 600);
Pane pane1 = new Pane();
pane1.setBackground(new Background(new BackgroundFill(Color.GREEN, CornerRadii.EMPTY, Insets.EMPTY)));
pane1.setMinSize(root.getWidth()/3, root.getHeight()/2);
Pane pane2 = new Pane();
pane2.setBackground(new Background(new BackgroundFill(Color.WHITE, CornerRadii.EMPTY, Insets.EMPTY)));
pane2.setMinSize(root.getWidth()/3, root.getHeight()/2);
Pane pane3 = new Pane();
pane3.setBackground(new Background(new BackgroundFill(Color.GREY, CornerRadii.EMPTY, Insets.EMPTY)));
pane3.setMinSize(root.getWidth()/3, root.getHeight()/2);
Pane pane4 = new Pane();
pane4.setBackground(new Background(new BackgroundFill(Color.BLUE, CornerRadii.EMPTY, Insets.EMPTY)));
pane4.setMinSize(root.getWidth()/3, root.getHeight()/2);
Pane pane5 = new Pane();
pane5.setBackground(new Background(new BackgroundFill(Color.RED, CornerRadii.EMPTY, Insets.EMPTY)));
pane5.setMinSize(root.getWidth()/3, root.getHeight()/2);
Pane pane6 = new Pane();
pane6.setBackground(new Background(new BackgroundFill(Color.YELLOW, CornerRadii.EMPTY, Insets.EMPTY)));
pane6.setMinSize(root.getWidth()/3, root.getHeight()/2);
root.getChildren().addAll(pane1, pane2, pane3, pane4, pane5, pane6);
GridPane.setRowIndex(pane1, 0);
GridPane.setColumnIndex(pane1, 0);
GridPane.setRowIndex(pane2, 0);
GridPane.setColumnIndex(pane2, 1);
GridPane.setRowIndex(pane3, 0);
GridPane.setColumnIndex(pane3, 2);
GridPane.setRowIndex(pane4, 1);
GridPane.setColumnIndex(pane4, 0);
GridPane.setRowIndex(pane5, 1);
GridPane.setColumnIndex(pane5, 1);
GridPane.setRowIndex(pane6, 1);
GridPane.setColumnIndex(pane6, 2);
primaryStage.setTitle("Learning JavaFX");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
好的,我找到了部分解决方案。我添加到我的代码中:
ColumnConstraints column1 = new ColumnConstraints();
column1.setPercentWidth(33.333333);
ColumnConstraints column2 = new ColumnConstraints();
column2.setPercentWidth(33.333333);
ColumnConstraints column3 = new ColumnConstraints();
column3.setPercentWidth(33.333333);
root.getColumnConstraints().addAll(column1, column2, column3);
RowConstraints row1 = new RowConstraints();
row1.setPercentHeight(50);
RowConstraints row2 = new RowConstraints();
row2.setPercentHeight(50);
root.getRowConstraints().addAll(row1, row2);
并删除了所有设置窗格大小的行,并允许调整内容的大小。
但是
当我将百分比宽度指定为 (100/3) 而不是 33.3333 时,它会在 window 的右侧留下一个奇怪的白色 space。有人可以向我解释为什么会这样吗?
看一看:
使用 ColumnConstraints
和 RowConstraints
实现所需的调整大小行为:
import javafx.application.Application;
import javafx.collections.ObservableList;
import javafx.geometry.HPos;
import javafx.geometry.Insets;
import javafx.geometry.VPos;
import javafx.scene.Scene;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundFill;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.CornerRadii;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.Priority;
import javafx.scene.layout.RowConstraints;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
public class Main6 extends Application {
private static final int ROWS = 2, COLS = 3;
private static final Color[][] colors = new Color[][] {
{Color.GREEN, Color.WHITE, Color.GRAY},
{Color.BLUE, Color.RED, Color.YELLOW}
};
@Override
public void start(Stage primaryStage) throws Exception {
GridPane root = new GridPane();
root.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
//add panels
for(int row = 0; row < ROWS; row++){
for(int col = 0; col < COLS; col++){
root.getChildren().add( getPane(row, col));
}
}
//Construct column constraints to resize horizontaly
ObservableList<ColumnConstraints> colCconstraints = root.getColumnConstraints();
colCconstraints.clear();
for(int col = 0; col < COLS; col++){
ColumnConstraints c = new ColumnConstraints();
c.setHalignment(HPos.CENTER);
c.setHgrow(Priority.ALWAYS);
colCconstraints.add(c);
}
//Construct row constraints to resize vertically
ObservableList<RowConstraints> rowCconstraints = root.getRowConstraints();
rowCconstraints.clear();
for(int row = 0; row < ROWS; row++){
RowConstraints c = new RowConstraints();
c.setValignment(VPos.CENTER);
c.setVgrow(Priority.ALWAYS);
rowCconstraints.add(c);
}
Scene scene = new Scene(root);
primaryStage.setTitle("Learning JavaFX");
primaryStage.setScene(scene);
primaryStage.sizeToScene();
primaryStage.show();
}
/**
*
*/
private Pane getPane(int row, int col) {
Pane pane = new Pane();
pane.setBackground(new Background(new BackgroundFill(colors[row][col], CornerRadii.EMPTY, Insets.EMPTY)));
pane.setPrefSize(300, 300);
GridPane.setRowIndex(pane, row);
GridPane.setColumnIndex(pane, col);
return pane;
}
public static void main(String[] args) {
launch(args);
}
}
我正在尝试构建一个简单的 Java 项目,其中包含 6 个窗格(作为父级添加到 GridPane 布局)。一开始就得设置window大小,参考根布局的宽高才设法平分。
pane.setMinSize(root.getWidth()/3, root.getHeight()/2);
但我希望它们在我更改 window 的大小时调整大小(使用鼠标,现在它们获得固定大小)。
所以我的问题是,如何在 JavaFX 中完成此操作?如何使元素拉伸并填充布局的 layout/part 大小,然后在调整 window 大小时更改大小?
这是我的代码:
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
public class Main6 extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
GridPane root = new GridPane();
Scene scene = new Scene(root, 900, 600);
Pane pane1 = new Pane();
pane1.setBackground(new Background(new BackgroundFill(Color.GREEN, CornerRadii.EMPTY, Insets.EMPTY)));
pane1.setMinSize(root.getWidth()/3, root.getHeight()/2);
Pane pane2 = new Pane();
pane2.setBackground(new Background(new BackgroundFill(Color.WHITE, CornerRadii.EMPTY, Insets.EMPTY)));
pane2.setMinSize(root.getWidth()/3, root.getHeight()/2);
Pane pane3 = new Pane();
pane3.setBackground(new Background(new BackgroundFill(Color.GREY, CornerRadii.EMPTY, Insets.EMPTY)));
pane3.setMinSize(root.getWidth()/3, root.getHeight()/2);
Pane pane4 = new Pane();
pane4.setBackground(new Background(new BackgroundFill(Color.BLUE, CornerRadii.EMPTY, Insets.EMPTY)));
pane4.setMinSize(root.getWidth()/3, root.getHeight()/2);
Pane pane5 = new Pane();
pane5.setBackground(new Background(new BackgroundFill(Color.RED, CornerRadii.EMPTY, Insets.EMPTY)));
pane5.setMinSize(root.getWidth()/3, root.getHeight()/2);
Pane pane6 = new Pane();
pane6.setBackground(new Background(new BackgroundFill(Color.YELLOW, CornerRadii.EMPTY, Insets.EMPTY)));
pane6.setMinSize(root.getWidth()/3, root.getHeight()/2);
root.getChildren().addAll(pane1, pane2, pane3, pane4, pane5, pane6);
GridPane.setRowIndex(pane1, 0);
GridPane.setColumnIndex(pane1, 0);
GridPane.setRowIndex(pane2, 0);
GridPane.setColumnIndex(pane2, 1);
GridPane.setRowIndex(pane3, 0);
GridPane.setColumnIndex(pane3, 2);
GridPane.setRowIndex(pane4, 1);
GridPane.setColumnIndex(pane4, 0);
GridPane.setRowIndex(pane5, 1);
GridPane.setColumnIndex(pane5, 1);
GridPane.setRowIndex(pane6, 1);
GridPane.setColumnIndex(pane6, 2);
primaryStage.setTitle("Learning JavaFX");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
好的,我找到了部分解决方案。我添加到我的代码中:
ColumnConstraints column1 = new ColumnConstraints();
column1.setPercentWidth(33.333333);
ColumnConstraints column2 = new ColumnConstraints();
column2.setPercentWidth(33.333333);
ColumnConstraints column3 = new ColumnConstraints();
column3.setPercentWidth(33.333333);
root.getColumnConstraints().addAll(column1, column2, column3);
RowConstraints row1 = new RowConstraints();
row1.setPercentHeight(50);
RowConstraints row2 = new RowConstraints();
row2.setPercentHeight(50);
root.getRowConstraints().addAll(row1, row2);
并删除了所有设置窗格大小的行,并允许调整内容的大小。
但是
当我将百分比宽度指定为 (100/3) 而不是 33.3333 时,它会在 window 的右侧留下一个奇怪的白色 space。有人可以向我解释为什么会这样吗?
看一看:
使用 ColumnConstraints
和 RowConstraints
实现所需的调整大小行为:
import javafx.application.Application;
import javafx.collections.ObservableList;
import javafx.geometry.HPos;
import javafx.geometry.Insets;
import javafx.geometry.VPos;
import javafx.scene.Scene;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundFill;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.CornerRadii;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.Priority;
import javafx.scene.layout.RowConstraints;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
public class Main6 extends Application {
private static final int ROWS = 2, COLS = 3;
private static final Color[][] colors = new Color[][] {
{Color.GREEN, Color.WHITE, Color.GRAY},
{Color.BLUE, Color.RED, Color.YELLOW}
};
@Override
public void start(Stage primaryStage) throws Exception {
GridPane root = new GridPane();
root.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
//add panels
for(int row = 0; row < ROWS; row++){
for(int col = 0; col < COLS; col++){
root.getChildren().add( getPane(row, col));
}
}
//Construct column constraints to resize horizontaly
ObservableList<ColumnConstraints> colCconstraints = root.getColumnConstraints();
colCconstraints.clear();
for(int col = 0; col < COLS; col++){
ColumnConstraints c = new ColumnConstraints();
c.setHalignment(HPos.CENTER);
c.setHgrow(Priority.ALWAYS);
colCconstraints.add(c);
}
//Construct row constraints to resize vertically
ObservableList<RowConstraints> rowCconstraints = root.getRowConstraints();
rowCconstraints.clear();
for(int row = 0; row < ROWS; row++){
RowConstraints c = new RowConstraints();
c.setValignment(VPos.CENTER);
c.setVgrow(Priority.ALWAYS);
rowCconstraints.add(c);
}
Scene scene = new Scene(root);
primaryStage.setTitle("Learning JavaFX");
primaryStage.setScene(scene);
primaryStage.sizeToScene();
primaryStage.show();
}
/**
*
*/
private Pane getPane(int row, int col) {
Pane pane = new Pane();
pane.setBackground(new Background(new BackgroundFill(colors[row][col], CornerRadii.EMPTY, Insets.EMPTY)));
pane.setPrefSize(300, 300);
GridPane.setRowIndex(pane, row);
GridPane.setColumnIndex(pane, col);
return pane;
}
public static void main(String[] args) {
launch(args);
}
}