I'm using JavaFX in a project instead of Swing because of the enhanced multimedia, webviewer and possibility to use visual effects. However, what I've learned from what I found on the web (http://docs.oracle.com/javafx/2/layout/jfxpub-layout.htm and others) is that JavaFX layout managers focus on scaling the size of the parent based on the size of the content, whereas Swing focusses on scaling the content according to the parent, at least based on the Layout
being used.
Right now I'm using an Accordion
with some TitledPane
children. One of them contains a GridPane
for the simple reason it is the best way I know to emulate a GridLayout
(as I learned from my previous question here: JavaFX layout equivalent to GridLayout). I want to have the TitledPane
's content split in 2 rows and 1 column, each row with a 50% height of the available space in the TitledPane
(scaling with the Stage
or Scene
), equivalent to what a GridLayout(2,1)
inside a BorderLayout.CENTER
would accomplish. For this, I've added a GridPane
with 2 RowConstraint
s using setPercentHeight(50)
and 1 ColumnConstraint
with setPercentWidth(100)
. However, I've noticed the contents are scaling with the grid properly, but the grid is not taking up all available space in the TitledPane
(because apparently it doesn't act like a BorderPane
's center). I've also tried with setMaxWidth
to make the content scale with the parent, but it doesn't seem to work either (as said here: JavaFX: How to make my custom component use all available space from parent layout?). And even if it would, do I need to set the max width to EACH descendent in my UI elements tree to have all of them scale?
Either way, does anyone know how to make a TitledPane
with 2 equal spaces in it underneath eachother that scale with the titledpane's size?
GridPane lays out its children within a flexible grid of rows and columns. If a border and/or padding is set, then its content will be layed out within those insets. A child may be placed anywhere within the grid and may span multiple rows/columns.
JavaFX provides several predefined layouts such as HBox, VBox, Border Pane, Stack Pane, Text Flow, Anchor Pane, Title Pane, Grid Pane, Flow Panel, etc. Each of the above mentioned layout is represented by a class and all these classes belongs to the package javafx. layout.
To set a different padding value for each edge, call it like this:. hbox. setPadding(new Insets(20, 10, 20, 10)); In this example, the top and bottom padding is set to 20 and the right and left padding is set to 10.
In fact, your gridpane is growing to fill all its parent. Consider the below code, I have added a background color (red) to the gridpane for debugging purposes.
Accordion accordion = new Accordion();
TitledPane titledPane = new TitledPane();
titledPane.setText("Title");
GridPane gridPane = new GridPane();
gridPane.setStyle("-fx-background-color:red");
gridPane.add(new TextArea("Hello"), 0, 0);
gridPane.add(new TextArea("World"), 0, 1);
titledPane.setContent(gridPane);
accordion.getPanes().add(titledPane);
If you execute this code, the gridpane will fill all its parent (check the red color spans all over the titledpane content).
However, the content of the gridpane will not fill all the column. If you try to resize the window, you will see that the textareas are not changing in width along with the gridpane. To fix that, you need to tell the first column of the gridpane to grow with the gridpane itself. The way to do that is to add the following constraint:
ColumnConstraints columnConstraints = new ColumnConstraints();
columnConstraints.setFillWidth(true);
columnConstraints.setHgrow(Priority.ALWAYS);
gridPane.getColumnConstraints().add(columnConstraints);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With