1
ラベルの入ったHboxを持っています。この箱は時には小さく、時には大きくなります。ラベルのサイズ変更を強制的に行う方法はありますか?label1は最初にサイズを変更します。それより小さければlabel2をサイズ変更し、小さければサイズを変更できません。JavafxのHBoxで独自のサイズ変更の優先順位を設定する方法
ラベルの入ったHboxを持っています。この箱は時には小さく、時には大きくなります。ラベルのサイズ変更を強制的に行う方法はありますか?label1は最初にサイズを変更します。それより小さければlabel2をサイズ変更し、小さければサイズを変更できません。JavafxのHBoxで独自のサイズ変更の優先順位を設定する方法
いいえ、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();
}
素晴らしいが、どのように変更するためには、左にaligmentですか?私は単純に0からサイズ-1まで繰り返すことでやりましたが、最後のラベルは「...」に短縮され、HLayoutの幅は何も測定されません。それを修正するには? – MrKaszu
@MrKaszuこれは、最初の 'rightBound'を子の推奨幅の合計で制限する必要があります。私は答えを編集しました。 – fabian