JavaFx:当窗格包含文本时调整大小

时间:2017-12-04 22:53:10

标签: java javafx

在JavaFX中,我在一个容器窗格内部的AnchorPane(或StackPane)内部有一个Label(或TextFlow)。

容器窗格具有无限高度,但其宽度固定为我想要的任何东西。

我需要:

1)AnchorPane的宽度可以填充所有可用空间,但不能大于标签在一行中的宽度。

2)标签为多线(wrap = true)并填充所有可用空间。

3)AnchorPane的高度等于Label的高度。

enter image description here

代码设置:

Pane rootPane = new Pane();
rootPane.setBackground(new Background(new BackgroundFill(Color.FIREBRICK, CornerRadii.EMPTY, Insets.EMPTY)));
AnchorPane anchorPane = new AnchorPane();
anchorPane.setBackground(new Background(new BackgroundFill(Color.FORESTGREEN, CornerRadii.EMPTY, Insets.EMPTY)));
Label text = new Label("text text text text text text text text text text text");
anchorPane.getChildren().add(text);
rootPane.getChildren().add(anchorPane);

或者,而不是我可以拥有的标签:

TextFlow text = new TextFlow(new Text("text text text text text text text text text text text"));

我在这个问题上浪费了几个小时。这在HTML中非常简单......我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

代码

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundFill;
import javafx.scene.layout.CornerRadii;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;


public class Main extends Application { 

    @Override
    public void start(Stage primaryStage) throws Exception{
        Pane rootPane = new Pane();

        Label text = new Label();        
        text.setWrapText(true);
        text.setText("text text text text text text text text text text text");

        AnchorPane anchorPane = new AnchorPane();
        anchorPane.getChildren().add(text);
        anchorPane.setBackground(new Background(new BackgroundFill(Color.FORESTGREEN, CornerRadii.EMPTY, Insets.EMPTY)));

        rootPane.getChildren().add(anchorPane);
        rootPane.setBackground(new Background(new BackgroundFill(Color.FIREBRICK, CornerRadii.EMPTY, Insets.EMPTY)));

        primaryStage.setScene(new Scene(rootPane, 300, 275));
        primaryStage.show();

        rootPane.widthProperty().addListener(new ChangeListener<Number>() {

            private double textWidth;

            @Override
            public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {

                if(text.getWidth() > 0 && textWidth == 0) {
                    textWidth = text.getWidth();
                }

                if(textWidth > 0 && textWidth > rootPane.getWidth())
                {
                    text.setPrefWidth(rootPane.getWidth());
                }else
                {
                    text.setPrefWidth(Label.USE_COMPUTED_SIZE);
                }
            }
        });
    }


    public static void main(String[] args) {
        launch(args);
    }
}

结果