如何在调整 window 大小时自动调整 BorderPane 上按钮的大小?
How to automatically resize buttons on BorderPane as the window is resized?
我在 Java 中处于中等水平,对 JavaFX 相当陌生。我正在开发一个在 JavaFX 8 中使用 BorderPane 的应用程序。我在 BorderPane 底部有两个按钮。
- 我想将按钮放置/对齐到 BorderPane 底部的中心,但我不知道完成这项工作的功能。我正在尝试 :
Bpane.setAlignment(bttmBttn, Pos.BOTTOM_CENTER)
但没用。我希望他们始终是中心。看起来像这样:
- 我希望能够在 window 调整大小时自动调整按钮的大小。截至目前,随着 window 的扩展,按钮之间保持相同的间隙,这使得它看起来像这样:
要使BorderPane 底部的按钮居中对齐,一种简单方便的方法是使用HBox 作为两个按钮的父容器。
HBox box = new HBox(10, button1, button2); // 10 is spacing
box.setAlignment(Pos.CENTER);
borderPane.setBottom(box);
由于您希望按钮在展开屏幕时展开,您可以将这些按钮的 HGROW 设置为 Priority.ALWAYS
。
HBox.setHgrow(button1, Priority.ALWAYS);
HBox.setHgrow(button2, Priority.ALWAYS);
您还必须通过调用 :
从按钮中删除 maxSize
约束
button1.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
button2.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
这种方法有一个小问题。这些按钮将捕获整个可用区域,而我们不希望这样。摆脱它的一种简单方法是在 HBox 的开头和结尾添加两个固定长度的透明矩形。
MCVE
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
Button button1 = new Button("Button 1");
Button button2 = new Button("Button 2");
button1.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
button2.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
Rectangle rect1 = new Rectangle(60, 20);
rect1.setFill(Color.TRANSPARENT);
Rectangle rect2 = new Rectangle(60, 20);
rect2.setFill(Color.TRANSPARENT);
HBox box = new HBox(10, rect1, button1, button2, rect2);
box.setAlignment(Pos.CENTER);
HBox.setHgrow(button1, Priority.ALWAYS);
HBox.setHgrow(button2, Priority.ALWAYS);
BorderPane root = new BorderPane();
root.setBottom(box);
Scene scene = new Scene(root, 300, 250);
primaryStage.setTitle("Main Stage");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
我在 Java 中处于中等水平,对 JavaFX 相当陌生。我正在开发一个在 JavaFX 8 中使用 BorderPane 的应用程序。我在 BorderPane 底部有两个按钮。
- 我想将按钮放置/对齐到 BorderPane 底部的中心,但我不知道完成这项工作的功能。我正在尝试 :
Bpane.setAlignment(bttmBttn, Pos.BOTTOM_CENTER)
但没用。我希望他们始终是中心。看起来像这样:
- 我希望能够在 window 调整大小时自动调整按钮的大小。截至目前,随着 window 的扩展,按钮之间保持相同的间隙,这使得它看起来像这样:
要使BorderPane 底部的按钮居中对齐,一种简单方便的方法是使用HBox 作为两个按钮的父容器。
HBox box = new HBox(10, button1, button2); // 10 is spacing
box.setAlignment(Pos.CENTER);
borderPane.setBottom(box);
由于您希望按钮在展开屏幕时展开,您可以将这些按钮的 HGROW 设置为 Priority.ALWAYS
。
HBox.setHgrow(button1, Priority.ALWAYS);
HBox.setHgrow(button2, Priority.ALWAYS);
您还必须通过调用 :
从按钮中删除maxSize
约束
button1.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
button2.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
这种方法有一个小问题。这些按钮将捕获整个可用区域,而我们不希望这样。摆脱它的一种简单方法是在 HBox 的开头和结尾添加两个固定长度的透明矩形。
MCVE
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
Button button1 = new Button("Button 1");
Button button2 = new Button("Button 2");
button1.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
button2.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
Rectangle rect1 = new Rectangle(60, 20);
rect1.setFill(Color.TRANSPARENT);
Rectangle rect2 = new Rectangle(60, 20);
rect2.setFill(Color.TRANSPARENT);
HBox box = new HBox(10, rect1, button1, button2, rect2);
box.setAlignment(Pos.CENTER);
HBox.setHgrow(button1, Priority.ALWAYS);
HBox.setHgrow(button2, Priority.ALWAYS);
BorderPane root = new BorderPane();
root.setBottom(box);
Scene scene = new Scene(root, 300, 250);
primaryStage.setTitle("Main Stage");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}