2013-05-01 8 views
5

Sto affrontando un comportamento di layout strano quando utilizzo GirdPanes in JavaFX 2. Mentre di solito sembra diffondere lo spazio orizzontale in modo uniforme tra più campi, non lo fa in altri casi. Ecco un esempio che mostra l'effetto:Posso forzare GridPane di JavaFX per distribuire lo spazio in modo uniforme?

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 questo esempio la finestra di dialogo si ridimensionerà bene se eseguita così com'è. Se la dimensione minima del riquadro extra viene modificata nella versione nel commento, le cose iniziano a essere errate: lo spazio aggiuntivo nella prima riga verrà trasformato in uno spazio vuoto (anziché crescere il primo campo), riducendo la dimensione della finestra di dialogo. lontano dal primo campo già piccolo, lasciando intatta l'area vuota.

C'è un modo per far sì che GridPane utilizzi effettivamente lo spazio orizzontale disponibile per il primo campo? Capisco che ridurre le dimensioni della finestra di dialogo al di sotto del minimo necessario non produce necessariamente buoni risultati, ma non espandere il campo, in primo luogo, mi sembra sbagliato.

Sto usando JavaFX da JDK 1.7.0_21.

risposta

1

Sarà necessario esaminare le classi ColumnConstraints e RowConstraints. Questi diranno a GridPane come distribuire lo spazio. Sfortunatamente, l'API è più che un po 'scomoda qui. Se vuoi distribuire uniformemente una quantità sconosciuta di spazio, devi prima istanziare un vincolo, quindi usare #setPercentageWidth - questa opzione non è disponibile nel costruttore.

Tutto sommato, un GridPane con 3 colonne uniformemente distribuiti (se possibile nel rispetto minimo di dimensioni) sarà simile a questa:

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

È possibile gestire RowConstraints conseguenza. Potresti anche voler impostare l'allineamento nelle celle per assicurarti che la finestra di dialogo continui a essere visualizzata correttamente durante il ridimensionamento.

+0

Sono consapevole dei limiti, ma finora i miei esperimenti hanno prodotto risultati interessanti, ma non molto utili. Il calcolo delle larghezze sembra completamente rotto nel contesto delle dimensioni minime presenti - se tutte le colonne sono impostate su un 25% di larghezza la finestra diventa enorme. Sono passato a MiG Layout ormai. –