2017-02-24 3 views
1

ラベルの入ったHboxを持っています。この箱は時には小さく、時には大きくなります。ラベルのサイズ変更を強制的に行う方法はありますか?label1は最初にサイズを変更します。それより小さければlabel2をサイズ変更し、小さければサイズを変更できません。JavafxのHBoxで独自のサイズ変更の優先順位を設定する方法

答えて

2

いいえ、3種類のリサイズ動作しかありません。

  • NEVER
  • SOMETIMES
  • ALWAYS

NEVER何が必要明らかではないですし、残りの2つのサイズ変更の優先順位を持つ3種類の方法で3人の子供を作ることはできません。あなたはおそらくも県のサイズを計算の実装をオーバーライドする必要があり

public class HLayout extends Pane { 

    @Override 
    protected void layoutChildren() { 
     final double w = getWidth(); 
     final double h = getHeight(); 
     final double baselineOffset = getBaselineOffset(); 

     List<Node> managedChildren = getManagedChildren(); 
     int size = managedChildren.size(); 

     // compute minimal offsets from the left and the sum of prefered widths 
     double[] minLeft = new double[size]; 
     double pW = 0; 
     double s = 0; 
     for (int i = 0; i < size; i++) { 
      minLeft[i] = s; 
      Node child = managedChildren.get(i); 
      s += child.minWidth(h); 
      pW += child.prefWidth(h); 
     } 

     int i = size - 1; 
     double rightBound = Math.min(w, pW); 
     // use prefered sizes until constraint is reached 
     for (; i >= 0; i--) { 
      Node child = managedChildren.get(i); 
      double prefWidth = child.prefWidth(h); 
      double prefLeft = rightBound - prefWidth; 
      if (prefLeft >= minLeft[i]) { 
       layoutInArea(child, prefLeft, 0, prefWidth, h, baselineOffset, HPos.LEFT, VPos.TOP); 
       rightBound = prefLeft; 
      } else { 
       break; 
      } 
     } 
     // use sizes determined by constraints 
     for (; i >= 0; i--) { 
      double left = minLeft[i]; 
      layoutInArea(managedChildren.get(i), left, 0, rightBound-left, h, baselineOffset, HPos.LEFT, VPos.TOP); 
      rightBound = left; 
     } 
    } 

} 

注:

あなたは、レイアウトのこの種を自分で実装する必要があります。

使用例:

@Override 
public void start(Stage primaryStage) { 
    HLayout hLayout = new HLayout(); 

    // fills space required for window "buttons" 
    Region filler = new Region(); 
    filler.setMinWidth(100); 
    filler.setPrefWidth(100); 

    Label l1 = new Label("Hello world!"); 
    Label l2 = new Label("I am your father!"); 
    Label l3 = new Label("To be or not to be..."); 
    hLayout.getChildren().addAll(filler, l1, l2, l3); 

    Scene scene = new Scene(hLayout); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 
+0

素晴らしいが、どのように変更するためには、左にaligmentですか?私は単純に0からサイズ-1まで繰り返すことでやりましたが、最後のラベルは「...」に短縮され、HLayoutの幅は何も測定されません。それを修正するには? – MrKaszu

+0

@MrKaszuこれは、最初の 'rightBound'を子の推奨幅の合計で制限する必要があります。私は答えを編集しました。 – fabian

関連する問題