当窗口调整大小时,如何自动调整BorderPane上的按钮大小?

时间:2015-11-06 14:57:55

标签: java user-interface button javafx borderpane

我是Java的中间人,而且是JavaFX的新手。我正在开发一个在JavaFX 8中使用BorderPane的应用程序。我在BorderPane的底部有两个按钮。

  1. 我想将按钮放置/对齐在BorderPane底部的中心,但我不知道执行该工作的功能。我在尝试:
  2.   

    Bpane.setAlignment(bttmBttn,Pos.BOTTOM_CENTER)

    但没有奏效。我希望他们始终是一个中心。它看起来像这样:

    enter image description here

    1. 我希望能够在窗口调整大小时自动调整按钮大小。截至目前,按钮在窗口扩展时保持相同的间隙,这使得它看起来像这样:
    2. enter image description here

1 个答案:

答案 0 :(得分:0)

要对齐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);
    }
}