在JavaFX中,我在一个容器窗格内部的AnchorPane(或StackPane)内部有一个Label(或TextFlow)。
容器窗格具有无限高度,但其宽度固定为我想要的任何东西。
我需要:
1)AnchorPane的宽度可以填充所有可用空间,但不能大于标签在一行中的宽度。
2)标签为多线(wrap = true)并填充所有可用空间。
3)AnchorPane的高度等于Label的高度。
代码设置:
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中非常简单......我怎样才能做到这一点?
答案 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);
}
}