2013-05-01 10 views
5

Ich habe ein seltsames Layout-Verhalten, wenn ich GirdPanes in JavaFX 2 benutze. Während es normalerweise den horizontalen Abstand gleichmäßig zwischen mehreren Feldern zu verteilen scheint, tut es das in einigen anderen Fällen nicht. Hier ist ein Beispiel zeigt die Wirkung:Kann ich JavaFX's GridPane zwingen, den Raum gleichmäßig zu verteilen?

import javafx.application.Application; 
import javafx.geometry.Insets; 
import javafx.scene.Scene; 
import javafx.scene.control.Control; 
import javafx.scene.control.Label; 
import javafx.scene.control.TextField; 
import javafx.scene.layout.GridPane; 
import javafx.scene.layout.Pane; 
import javafx.stage.Stage; 

public class TestDialog extends Stage { 
    public TestDialog() { 
     super(); 
     setTitle("Test"); 

     GridPane grid = new GridPane(); 
     grid.setHgap(5); 
     grid.setVgap(5); 
     grid.setPadding(new Insets(10, 10, 10, 10)); 

     final TextField tField1 = new TextField(); 
     final TextField tField2 = new TextField(); 
     tField2.setMaxWidth(200); 

     grid.add(createLabel("Field 1:"), 0, 0); 
     grid.add(tField1, 1, 0); 
     grid.add(createLabel("Field 2:"), 2, 0); 
     grid.add(tField2, 3, 0); 

     Pane pane = new Pane(); 
//  pane.setMinSize(600, 100); // first row has weird layout behaviour 
     pane.setMinSize(100, 100); // first row is fine 
     pane.setStyle("-fx-background-color: black"); 
     grid.add(pane, 0, 1, 4, 1); 

     grid.setMinSize(Control.USE_PREF_SIZE, Control.USE_PREF_SIZE); 

     setScene(new Scene(grid)); 
    } 

    private Label createLabel(String text) { 
     Label label = new Label(text); 
     label.setMinSize(Control.USE_PREF_SIZE, Control.USE_PREF_SIZE); 
     return label; 
    } 

    public static void main(String[] args) { 
     TestApplication.main(args); 
    } 

    public static class TestApplication extends Application { 
     @Override 
     public void start(Stage stage) throws Exception { 
      TestDialog dialog = new TestDialog(); 
      dialog.showAndWait(); 
     } 

     public static void main(String[] args) { 
      launch(args); 
     } 
    } 
} 

In diesem Beispiel wird der Dialog gut skalieren, wenn laufen wie. Wenn die Mindestgröße des zusätzlichen Bereichs auf die Version im Kommentar geändert wird, dann gehen die Dinge schief: Extra-Speicherplatz in der ersten Zeile wird in einen leeren Bereich umgewandelt (anstatt das erste Feld zu vergrößern), wodurch die Größe des Dialogfelds verringert wird es entfernt sich von dem bereits kleinen ersten Feld und lässt die leere Fläche intakt.

Gibt es eine Möglichkeit, GridPane tatsächlich den verfügbaren horizontalen Speicherplatz für das erste Feld zu verwenden? Ich verstehe, dass das Reduzieren der Dialoggröße unterhalb des erforderlichen Minimums nicht notwendigerweise gute Ergebnisse hervorbringt, aber das Feld nicht in erster Linie zu erweitern, scheint mir einfach falsch zu sein.

Ich benutze JavaFX wie JDK 1.7.0_21.

Antwort

1

Sie müssen in die Klassen ColumnConstraints und RowConstraints schauen. Diese werden einem GridPane mitteilen, wie der Speicherplatz verteilt wird. Leider ist die API hier mehr als nur ein bisschen peinlich. Wenn Sie eine unbekannte Menge an Speicherplatz gleichmäßig verteilen möchten, müssen Sie zuerst eine Integritätsregel installieren und dann #setPercentageWidth verwenden. Diese Option ist im Konstruktor nicht verfügbar.

Alles in allem ein GridPane mit 3 gleichmäßig verteilt Spalten (wenn möglich während min Größen respektieren) wird wie folgt aussehen:

public class Test extends Application { 
    public void start(final Stage stage) throws Exception { 
     final GridPane grid = new GridPane(); 
     grid.getColumnConstraints().setAll(
       ColumnConstraintsBuilder.create().percentWidth(100/3.0).build(), 
       ColumnConstraintsBuilder.create().percentWidth(100/3.0).build(), 
       ColumnConstraintsBuilder.create().percentWidth(100/3.0).build() 
     ); 
     grid.add(new Button("One"),0,0); 
     grid.add(new Button("Two"),1,0); 
     grid.add(new Button("and three"),2,0); 

     stage.setScene(new Scene(grid)); 
     stage.show(); 
    } 

    public static void main(String[] args) { 
     Application.launch(args); 
    } 
} 

Sie RowConstraints entsprechend behandeln kann. Sie sollten die Ausrichtung auch in den Zellen festlegen, um sicherzustellen, dass Ihr Dialogfeld bei der Größenänderung immer noch gut aussieht.

+0

Ich bin mir der Einschränkungen bewusst, aber bis jetzt haben meine Experimente alle interessante, aber nicht sehr nützliche Ergebnisse hervorgebracht. Die Berechnung der Breiten scheint im Kontext der vorhandenen Mindestgrößen völlig gebrochen - wenn alle Spalten auf 25% Breite eingestellt sind, wird das Fenster sehr groß. Ich bin inzwischen zu MiG Layout übergegangen. –