2013-05-01 2 views
5

Я сталкиваюсь с немного странным поведением макета при использовании GirdPanes в JavaFX 2. Хотя обычно кажется, что равномерно распределено горизонтальное пространство между несколькими полями, в некоторых других случаях это не делается. Вот пример, показывающий эффект:Могу ли я заставить GridPane JavaFX распределять пространство равномерно?

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

В этом примере диалог будет красиво изменяться при запуске как есть. Если минимальный размер дополнительной панели изменен на версию в комментарии, тогда все начинает идти не так: дополнительное пространство в первой строке будет превращено в пустое пространство (вместо того, чтобы увеличивать первое поле), уменьшая размер диалогового окна это далеко от уже небольшого первого поля, оставляя пустую область неповрежденной.

Есть ли способ заставить GridPane фактически использовать доступное горизонтальное пространство для первого поля? Я понимаю, что уменьшение размера диалогового окна ниже необходимого минимума не обязательно приводит к хорошим результатам, но не расширение поля в первую очередь кажется мне неправильным.

Я использую JavaFX от JDK 1.7.0_21.

ответ

1

Вам нужно будет изучить классы ColumnConstraints и RowConstraints. Они расскажут GridPane, как распределять пространство. К сожалению, API здесь немного неловко. Если вы хотите равномерно распределить неизвестное пространство, вам нужно сначала установить ограничение, а затем использовать #setPercentageWidth - этот параметр недоступен в конструкторе.

Все в общем, GridPane 3 равномерно распределенных колонок (если это возможно при соблюдении мин размеры) будет выглядеть следующим образом:

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

Вы можете обрабатывать RowConstraints соответственно. Вы также можете настроить выравнивание в ячейках, чтобы убедиться, что ваше диалоговое окно по-прежнему выглядит хорошо при изменении размера.

+0

Я знаю ограничения, но до сих пор мои эксперименты производили интересные, но не очень полезные результаты. Расчет ширины кажется совершенно нарушенным в контексте минимальных размеров - если все столбцы установлены на 25%, окно становится огромным. Сейчас я перешел на МиГ Макет. –

Смежные вопросы