2013-05-01 19 views
5

Mam do czynienia z dziwnym zachowaniem układu podczas używania GirdPanes w JavaFX 2. Chociaż zazwyczaj wydaje się, że przestrzeń pozioma jest rozkładana równomiernie między wieloma polami, nie robi tego w innych przypadkach. Oto przykład pokazujący efekt:Czy mogę wymusić równomierne rozprowadzanie przestrzeni JavaFX w GridPane?

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); 
     } 
    } 
} 

W tym przykładzie okno dialogowe ładnie zmieni rozmiar, jeśli zostanie uruchomione w niezmienionym stanie. Jeśli minimalny rozmiar dodatkowego Okienka zostanie zmieniony na wersję w komentarzu, to wszystko zacznie się liczyć: dodatkowe miejsce w pierwszym rzędzie zostanie zamienione na pustą przestrzeń (zamiast rosnącego pierwszego pola), zmniejszając rozmiar okna dialogowego z dala od już małego pierwszego pola, pozostawiając nienaruszony pusty obszar.

Czy istnieje sposób na uzyskanie GridPane, aby faktycznie wykorzystać dostępną przestrzeń poziomą dla pierwszego pola? Rozumiem, że zmniejszenie rozmiaru okna dialogowego poniżej wymaganego minimum niekoniecznie musi przynieść dobre wyniki, ale nierozszerzanie pola w pierwszej kolejności wydaje mi się zupełnie błędne.

Używam JavaFX od JDK 1.7.0_21.

Odpowiedz

1

Będziesz musiał zajrzeć do klas ColumnConstraints i RowConstraints. Będą one informować GridPane o sposobie dystrybucji przestrzeni. Niestety interfejs API jest tutaj trochę niezręczny. Jeśli chcesz równomiernie rozprowadzić nieznaną ilość miejsca, musisz najpierw wprowadzić ograniczenie, a następnie użyć #setPercentageWidth - ta opcja nie jest dostępna w konstruktorze.

W sumie, GridPane z 3 równomiernie rozłożonych kolumn (jeśli to możliwe, przy jednoczesnym poszanowaniu min rozmiary) będzie wyglądać następująco:

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); 
    } 
} 

można obsługiwać RowConstraints odpowiednio. Możesz również ustawić wyrównanie w komórkach, aby upewnić się, że okno dialogowe nadal wygląda dobrze podczas zmiany rozmiaru.

+0

Jestem świadomy ograniczeń, ale do tej pory moje eksperymenty dały ciekawe, ale niezbyt przydatne wyniki. Obliczenia szerokości wydają się całkowicie zepsute w kontekście obecnych minimalnych rozmiarów - jeśli wszystkie kolumny są ustawione na 25% szerokości, okno staje się ogromne. Przeniosłem się do układu MiG już teraz. –