Как автоматически изменять размер кнопок на BorderPane при изменении размера окна?

Я средний в Java и довольно новичок в JavaFX. Я разрабатываю приложение, использующее BorderPane в JavaFX 8. У меня есть две кнопки внизу BorderPane.

  1. Я хочу разместить/выровнять кнопки по центру нижней части BorderPane, но не знаю, какая функция выполняет эту работу. Я пытался с:

Bpane.setAlignment(bttmBttn, Pos.BOTTOM_CENTER)

но не работал. Я хочу, чтобы они всегда были в центре внимания. Это выглядит так:

введите здесь описание изображения

  1. Я хочу иметь возможность автоматически изменять размер кнопок при изменении размера окна. На данный момент кнопки сохраняют тот же зазор между собой, когда окно расширяется, что делает его таким:

введите здесь описание изображения


person Auro    schedule 06.11.2015    source источник


Ответы (1)


Чтобы выровнять кнопки по центру нижней части 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);
    }
}
person ItachiUchiha    schedule 06.11.2015
comment
@ItachiUchihaБольшое спасибо. Это помогло - person Auro; 07.11.2015