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.
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. –