JavaFX - FlowPane自动调整大小

时间:2017-05-23 12:21:37

标签: java javafx javafx-8 flowpane

这是我的问题:我希望得到一个水平方向的窗格和宽度适合他的内容(如FlowPane),但如果宽度太高,Pane会包含其内容。我不想按子宽度计算'prefWidth'或'prefWrappingLength',因为它们很丰富。

在帖子JavaFX FlowPane Autosize中,他们为包装文本提供解决方案,但不为布局提供解决方案。

给我一​​些提示吗?

1 个答案:

答案 0 :(得分:0)

对于那些正在寻找答案的人来说,这就是我最终做的事情,忽略了丰富的儿童约束:

class RuleBox extends FlowPane {
    int maxWrapLength;
    int margin = 30;

    RuleBox(int maxWrapLength) {
        super();
        this.maxWrapLength = maxWrapLength;
        getChildren().addListener((ListChangeListener<? super Node>) observable -> actualizeWrapLength(observable.getList()));
    }

    private void actualizeWrapLength(ObservableList<? extends Node> list) {
        new Thread(() -> {
            try { Thread.sleep(50);
            } catch (InterruptedException ignored) {}
            Platform.runLater(() -> {
                int totalWidth = 0;
                for(Node n : list) {
                    if(n instanceof Control) totalWidth+=((Control)n).getWidth();
                    else if(n instanceof Region) totalWidth+=((Region)n).getWidth();
                }
                if(totalWidth+margin>maxWrapLength) setPrefWrapLength(maxWrapLength);
                else setPrefWrapLength(totalWidth+margin);
            });
        }).start();
    }

    void actualizeWrapLength() {
        actualizeWrapLength(getChildren());
    }
}

这是一个相当脏的代码,特别是对于曾经拥有子代的最终宽度的Thread.sleep(50)。所以如果有人拥有更好的解决方案,请给它!