2016-05-08 8 views
0

Ich habe drei VBoxen in einer HBox. Ich möchte, dass alle von ihnen immer ein Drittel der HBox und die volle Höhe einnehmen. Ich habe versucht HBox.setHgrow(<every VBox>, Priority.ALWAYS) mit <every VBox>.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE); und das hat gut funktioniert, aber wenn ich eine Komponente zu einer der VBoxen hinzugefügt, änderte es sich selbst und wurde größer als die anderen.Habe drei gleich große VBoxen in HBox in javafx

Irgendeine Idee, wie man das richtig löst?

+1

Müssen Sie diese Struktur aus irgendeinem Grund verwenden? Das Platzieren der 'VBox' in einem 'GridPane' und das Setzen von' columnConstraint 'würde dies sehr einfach machen. –

+0

Ah, ja, das macht mehr Sinn. Ich habe 3 'columnConstraint' eingerichtet und meine VBoxen hinzugefügt. Wie bekomme ich sie jetzt immer die volle Höhe und ein Drittel der Breite? Sie scheinen nicht ohne Inhalt zu expandieren. –

+0

Nevermind, machte es dank! –

Antwort

1

anstelle des HBox ein GridPane verwenden. Sie können eine Auflistung von Spaltenbeschränkungen verwenden, die jeweils den Wert percentWidth enthalten, um jeder Spalte die gleiche Breite zu geben.

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

Sie können Ihre VBox zu einer StackPane und die StackPane zu der HBox hinzufügen. In die StackPane platzierst du auch einen Platzhalter (ich benutze normalerweise eine transparente Rectangular) und bind das an die Bindung maxVBoxWidth. Dies ist ein Binding, die Sie selbst definieren müssen:

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