2015-04-16 4 views
2

У меня есть GridPane, который имеет два столбца: сначала содержит ImageView с фиксированным размером, второй - VBox с текстовыми элементами. Мне нужен этот VBox, чтобы он соответствовал ширине столбца. Сетка имеет правильные размеры, ImageView тоже, но VBox во втором столбце соответствует тексту, который он содержит, а не к parent (grid).Подгонка VBox к родительскому GridPane

VBox box = new VBox(); 
// all three texts can be changed during program execution by user 
// (so 'box' width cannot be based on children widths) 
box.getChildren().addAll(new Text("1"), new Text("2"), new Text("3")); 
box.setStyle("-fx-background-color: red;"); 

Image image = ...; // image is always 150x150 px 
ImageView imgView = new ImageView(image); 
GridPane grid = new GridPane(); 
grid.add(imgView, 0,0); 
grid.add(box,1,0); 
grid.add(new Text("another content"), 0,1,2,1); 

В соответствии с данным примером я хочу, чтобы «ящик» имел ту же ширину, что и второй столбец «сетки». Как это исправить?

enter image description here Контейнер с зеленой границей: GridPane сетка Контейнер с LightBlue границей: VBox коробка GridPane имеет красный фон, VBox имеет розовый фон. Вы можете видеть, что он явно НЕ соответствует его родительской ширине.

Заранее спасибо

+0

Предоставьте [mcve] (http://stackoverflow.com/help/mcve), например. файл FXML (если вы используете FXML) или код Java (если вы этого не сделали). – jewelsea

+0

содержание отредактировано.Надеюсь, теперь ясно. –

+0

Вы хотите, чтобы VBox имел ту же ширину, что и «ImageView»? Что такое «вторая колонка»? Согласно предоставленному коду, VBox находится во втором столбце. – ItachiUchiha

ответ

2

Вы можете установить Hgrow для детей из GridPane. Установка HGrow как Always позволит им занять total width available.

box Как это ребенок gridPane, вы можете применить свойство, используя статический метод setHgrow

GridPane.setHgrow(box, Priority.Always); 

Для подобных проблем с height, вы можете использовать setVGrow(Node child, Priority value).

1

Понимание предпочтительным проклейки

Механизм калибровки по умолчанию, когда компоненты размещены в сцене без дополнительных компонентов, сцены или размер ступени ограничений является размер всех компонентов, чтобы их предпочтительным размер.

От Scene javadoc:

размер сцены может быть инициализирован приложением во время строительства. Если размер не указан, сцена автоматически вычисляет его начальный размер на основе предпочтительного размера его содержимого.

Работы, как и ожидалось

код вы предоставили работает, как я ожидал бы - все содержание размером в нужный размер.

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

Пример программы

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.image.*; 
import javafx.scene.layout.*; 
import javafx.scene.text.Text; 
import javafx.stage.Stage; 

public class GridSample extends Application { 

    @Override 
    public void start(Stage stage) throws Exception { 
     VBox box = new VBox(); 
     box.getChildren().addAll(new Text("1"), new Text("2"), new Text("3")); 
     box.setStyle("-fx-background-color: red;"); 

     Image image = new Image(IMAGE_LOC); 
     ImageView imgView = new ImageView(image); 
     GridPane grid = new GridPane(); 
     grid.add(imgView, 0,0); 
     grid.add(box, 1, 0); 
     grid.add(new Text("another content"), 0,1,2,1); 

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

     System.out.println("Grid width: " + grid.getWidth()); 
     System.out.println("Image width: " + imgView.getLayoutBounds().getWidth()); 
     System.out.println("Box width: " + box.getWidth()); 
     final double secondColWidth = 
       grid.getWidth() - imgView.getLayoutBounds().getWidth(); 
     System.out.println(
       "Width of box matches width of second grid column: " + 
         (box.getWidth() == secondColWidth) 
     ); 
    } 

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

    public static final String IMAGE_LOC = 
      "http://icons.iconarchive.com/icons/designbolts/thin-download/128/Download-from-Internet-icon.png"; 
    // icon License: Linkware (Backlink to http://www.designbolts.com required) 

} 

Программа выходного

 
Grid width: 137.0 
Image width: 128.0 
Box width: 9.0 
Width of box matches width of second grid column: true 
+0

Спасибо за внимание и помощь, я нахожу, что ур ответ очень полезен, либо –

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