【问题标题】:How to set own resize priority in Javafx's HBox如何在 Javafx 的 HBox 中设置自己的调整大小优先级
【发布时间】:2017-07-15 07:07:41
【问题描述】:

我有 Hbox,里面有标签。这个盒子有时更小,有时更大。有什么办法可以强制它的子项(标签)调整大小,例如:label1 首先调整大小,如果不能更小,则 label2 调整大小,如果不能更小 label3 调整大小等?

【问题讨论】:

    标签: java javafx resize hbox


    【解决方案1】:

    不,只有 3 种不同的调整大小行为。

    • NEVER
    • SOMETIMES
    • ALWAYS

    NEVER 显然不是您所需要的,并且您不能以 3 种不同的方式制作 3 个孩子,而剩下的 2 个调整大小优先级。

    这种布局需要你自己实现:

    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 迭代到 size-1 来做到这一点,但现在每个标签而不是最后一个都缩短为“...”,这与 HLayout 宽度无关。如何解决?
    • @MrKaszu 这要求您将初始 rightBound 限制为子项首选宽度的总和。我编辑了答案。
    猜你喜欢
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-14
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    相关资源
    最近更新 更多