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 Control
s, et non pas sur Pane
s. Ces fenêtres doivent être suffisamment intelligent pour se redimensionnent automatiquement en fonction de leur parent.
Est-il un moyen pour le GridPane
s 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
Vous devez vous connecter pour publier un commentaire.
Essayez d'utiliser
RowConstraints
etColumnConstraints
de GridPane:et sans appel
addResizeListeners()
.Button
s (Control
s). Maintenant, que diriez -Pane
s? Ils n'ont passetMinSize
etsetMaxSize
Api.Êtes-vous sûr? Volet a que des méthodes.
Oh l'homme.. je m'en excuse. Vous avez raison, j'ai écrit un commentaire stupide. Quelle que soit votre réponse semble vraiment prometteur. Je vais revenir à vous.
OriginalL'auteur Uluk Biy