2016-05-08 1 views
0

У меня есть три VBoxes в HBox. Я хочу, чтобы все они всегда занимали одну треть HBox и всю высоту. Я пробовал HBox.setHgrow(<every VBox>, Priority.ALWAYS) с <every VBox>.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);, и это сработало нормально, но когда я добавил компонент в один из VBoxes, он изменил размер и стал больше, чем другие.Имейте три одинаковых размера VBoxes в HBox в javafx

Любая идея, как решить это правильно?

+1

Вы должны использовать эту структуру по какой-то причине? Размещение 'VBox'es в' GridPane' и установка 'columnConstraint' сделало бы это очень просто. –

+0

А, да, это имеет смысл. Я создал 3 'columnConstraint' и добавил свои VBoxes. Как мне заставить их всегда брать всю высоту и одну треть ширины? Они не расширяются без содержания. –

+0

Nevermind, спасибо! –

ответ

1

Используйте GridPane вместо HBox. Вы можете использовать набор ограничений столбцов, каждый из которых имеет набор percentWidth, чтобы дать каждому столбцу равную ширину.

SSCCE:

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.layout.ColumnConstraints; 
import javafx.scene.layout.GridPane; 
import javafx.scene.layout.Priority; 
import javafx.scene.layout.RowConstraints; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 

public class VBoxInGridPane extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     VBox box1 = new VBox(); 
     box1.setStyle("-fx-background-color: -fx-background; -fx-background: red ;"); 
     box1.getChildren().add(new Label("Content")); 
     VBox box2 = new VBox(); 
     box2.setStyle("-fx-background-color: green ;"); 
     VBox box3 = new VBox(); 
     box3.setStyle("-fx-background-color: blue ;"); 

     GridPane root = new GridPane(); 
     root.add(box1, 0, 0); 
     root.add(box2, 1, 0); 
     root.add(box3, 2, 0); 

     for (int i = 0 ; i < 3 ; i++) { 
      ColumnConstraints cc = new ColumnConstraints(); 
      cc.setPercentWidth(100.0/3.0); 
      cc.setHgrow(Priority.ALWAYS); 
      root.getColumnConstraints().add(cc); 
     } 

     RowConstraints rc = new RowConstraints(); 
     rc.setVgrow(Priority.ALWAYS); 
     root.getRowConstraints().add(rc); 

     Scene scene = new Scene(root, 400, 400); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 

    } 

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

Что вы можете сделать, это добавить VBox в StackPane и StackPane в HBox. В StackPane вы также помещаете заполнитель (я обычно использую прозрачный Rectangular) и привязываю его к привязке maxVBoxWidth. Это Binding, что вы должны определить себя:

DoubleBinding maxVBoxBinding = new DoubleBinding() { 
     { 
      super.bind(vbox1.widthProperty(),vbox2.widthProperty(), vbox3.widthProperty()); 
     } 
     @Override 
     protected double computeValue() { 
      return Math.max(vbox1.getWidth(), Math.max(vbox2.getWidth(), vbox2.getWidth())); 
     } 
    }