2016-05-08 6 views
0

私はHBoxに3つのVBoxを持っています。私は彼らのすべてが常にHBoxの3分の1と完全な高さを取るようにしたい。私はHBox.setHgrow(<every VBox>, Priority.ALWAYS)<every VBox>.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);を試しましたが、うまくいきましたが、コンポーネントをVBoxの1つに追加すると、サイズが変更され、他のコンポーネントよりも大きくなりました。javafxのHBoxに同じサイズのVBoxを3つ持っています

これを正しく解決する方法はありますか?

+1

あなたには、いくつかの理由でその構造を使用する必要がありますか? 'VBox'を' GridPane'に配置し、 'columnConstraint'sを設定すると、これは非常に簡単になります。 –

+0

ああ、そうですね。私は3つの 'columnConstraint'sを設定し、私のVBoxesを追加しました。どのようにすれば、今は幅の全高と1/3を常に取るようにするのですか?彼らはコンテンツなしでは拡大していないようです。 –

+0

心配してくれてありがとう! –

答えて

1

ではなくHBoxGridPaneを使用してください。それぞれの列に等しい幅を与えるように、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

あなたができることはStackPaneVBoxを追加し、にStackPaneを追加することです。 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())); 
     } 
    } 
関連する問題