JavaFX GridPane redimensionnement de volet enfants

Ce être un double de la question, mais je n'ai pas trouvé une solution qui convient à mes besoins.

Inspiré de jewelsea's ColorChooserSample, à mi-chemin par le biais de mon application, j'ai réalisé que le manuel de la taille ne peut être réglé que sur Controls, et non pas sur Panes. Ces fenêtres doivent être suffisamment intelligent pour se redimensionnent automatiquement en fonction de leur parent.

Est-il un moyen pour le GridPanes les enfants à saisir l'espace vertical et horizontal en même temps? Un peu comme un VBox et HBox combiné. Je parie que la solution consiste à AnchorPane.

Garder mes enfants sont volets et pas de contrôles.


SSCCE avec des boutons (copier - coller - run - redimensionner la fenêtre)

import javafx.application.Application;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.geometry.Bounds;
import javafx.geometry.Insets;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Control;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
/**
* 
* @author ggrec
*
*/
public class DashboardFXGrid extends Application
{
//==================== 1. Static Fields ========================
private final static double GOLDEN_RATIO = 1.618;
private final static double MIN_TILE_SIZE = 5;
private final static double MAX_TILE_SIZE = Double.MAX_VALUE;
//====================== 2. Instance Fields =============================
private DoubleProperty prefTileSize = new SimpleDoubleProperty(MIN_TILE_SIZE);
private double nColumns;
private double nRows;
private GridPane gridPane;
//==================== 3. Static Methods ====================
public static void main(final String[] args)
{
Application.launch(args);
}
//==================== 4. Constructors ====================
@Override
public void start(final Stage primaryStage) throws Exception
{
gridPane = new GridPane();
gridPane.setPadding(new Insets(20));
gridPane.setHgap(10);
gridPane.setVgap(10);
nColumns = Math.floor(Math.sqrt(dummyButtons().length) * 2 / GOLDEN_RATIO);
nRows    = Math.ceil(dummyButtons().length / nColumns);
createContents();
addResizeListeners();
primaryStage.setScene(new Scene(gridPane));
primaryStage.show();
}
//==================== 5. Creators ====================
private void createContents()
{
int i = 0;
for (final Button button : dummyButtons())
{
GridPane.setRowIndex(button,       i / (int) nColumns);
GridPane.setColumnIndex(button, i % (int) nColumns);
button.setMinSize(MIN_TILE_SIZE, MIN_TILE_SIZE);
button.setMaxSize(MAX_TILE_SIZE, MAX_TILE_SIZE);
gridPane.getChildren().add(button);
i++;
}
}
private void addResizeListeners()
{
gridPane.layoutBoundsProperty().addListener(new ChangeListener<Bounds>() {
@Override public void changed(final ObservableValue<? extends Bounds> observableValue, final Bounds oldBounds, final Bounds newBounds)
{
prefTileSize.set(Math.max(MIN_TILE_SIZE, Math.min(newBounds.getWidth() / nColumns, newBounds.getHeight() / nRows)));
for (final Node child : gridPane.getChildrenUnmodifiable())
{
final Control tile = (Control) child;
tile.setPrefSize(prefTileSize.get(), prefTileSize.get());
}
}
});
}
//==================== 15. Other ====================
private static final Button[] dummyButtons()
{
final Button[] buttons = new Button[5];
for(int i = 0; i < buttons.length; i++)
{
buttons[i] = new Button(String.valueOf(i));
}
return buttons;
}
}

OriginalL'auteur GGrec | 2014-03-10