这是我的问题:我想获得一个水平放置的窗格,并且其内容适合其宽度(例如FlowPane),但是如果宽度太大,则窗格将包装其内容。我不想通过孩子的宽度来计算“ prefWidth”或“ prefWrappingLength”,因为它们很多。

在线程JavaFX FlowPane Autosize中,他们提供了包装文本的解决方案,但没有提供布局的解决方案。

你有给我的提示吗?

最佳答案

对于那些正在寻找答案的人,这是我最终所做的,而忽略了众多的孩子约束:

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)用来具有最终宽度的子代的代码。因此,如果有人拥有更好的解决方案,请给它!

10-07 23:49