Страницы

Поиск по вопросам

понедельник, 24 февраля 2020 г.

JavaFX: Динамический контент GridPane

#java #javafx #gridpane



Есть форма, в ней есть GridPane. В GridPane есть элементы, предположим Rectangle
(квадраты), а форма может растягиваться вместе с GridPane
Как сделать чтобы если форма стала шире (вместе с GridPane), элементы то что были
ниже переместились в свободное место справа и наоборот, если форма стала уже, то элементы
что не влезают справа, переместились вниз
Добавлять динамически при нажатии кнопки Rectangle не задавая ячейки (в свободное
место ниже и выше сдвигая остальные элементы)

    


Ответы

Ответ 1



Ну касательно первого пункта вот вам развернуты пример кода с слушателем ответственным за подобные изменения: public class ResizableGridPane extends Application { private static final Double rectaWidth = 100d, rectaHeigth = 50d; public static void main(String[] args) { Application.launch(args); } @Override public void start(Stage primaryStage) throws Exception { GridPane grid = new GridPane(); AnchorPane root = new AnchorPane(grid); grid.prefWidthProperty().bind(root.widthProperty()); Rectangle a = new Rectangle(rectaWidth, rectaHeigth); a.setFill(Color.RED); Rectangle b = new Rectangle(rectaWidth, rectaHeigth); b.setFill(Color.BLUE); Rectangle c = new Rectangle(rectaWidth, rectaHeigth); c.setFill(Color.YELLOW); Rectangle[] recta = { a, b, c }; grid.prefWidthProperty().addListener((e) -> { int colums = (int) (((DoubleProperty) e).getValue() / rectaWidth); colums = colums < 1 ? 1 : colums > recta.length ? recta.length % colums : colums; for (int row = 0; row < Math.ceil(((double) recta.length / (double) colums)); row++) { for (int colum = 0; colum < colums; ++colum) { if (((row * colums) + colum) < recta.length) grid.setConstraints(recta[(row * colums) + colum], colum, row); } } }); grid.getChildren().addAll(a, b, c); Scene s = new Scene(root, 500, 500); primaryStage.setScene(s); primaryStage.show(); } } Слушатель динамически отслеживает ширину панели и соответсвенно подгоняет колличество столбцов перемещая каждый раз все прямоугольнии...Вполне верным будет решение с хранением теущих индексов положения обектов в сетке в неком классе моделе и использовать такое решение для динамичесого добавления обекта в сетку...Это уже ближе к 2ой части вопроса...

Ответ 2



Без написания своих велосипедов можно использовать FlowPane или стороннее решение - GridView.

Комментариев нет:

Отправить комментарий