javaFx标签wrapText不起作用

问题描述 投票:0回答:3

我是新开发人员,我尝试制作一个程序。在我的程序中,有一个消息列表(

listMessages
),其中的每条消息都是我创建的
MessageItemController
(自定义控件),其中包含一个标签和一些其他内容的
VBox
VBox
中的
MessageItemController
的Sudo代码:

<VBox fx:id="VBoxContent" GridPane.columnIndex="1" GridPane.rowIndex="1" GridPane.vgrow="ALWAYS">
        <children>
            <Label fx:id="lblMessage" text="message" textOverrun="CLIP" wrapText="true">
                <padding>
                    <Insets left="10.0" />
                </padding>
            </Label>
           ...
        </children>
    </VBox>

我想要

VBoxContent
有一个最大宽度。之前,我将
MaxWidth
设置为
VBoxContent
,例如 300px。 (我在 scenebuilder 和我的 fxml 文件中执行此操作,而不是使用代码)。工作完美。我添加到我的
listMessages
作品中的所有信息。
现在我改变了我的想法,我希望
MessageItemController
具有 maxWidth,但为其父级的 0.5%(我的意思是
listMessages
,我将这些消息添加到它们中)。所以我从 fxml 文件中删除
maxWidth
并将此代码添加到我的控制器中:

listMessages.widthProperty().addListener((observable, oldValue, newValue) -> {
        if (observableListMessages != null)
            observableListMessages.forEach(x -> {
                x.VBoxContent.setMaxWidth(0.5 * newValue.doubleValue());                    
            });
    });

但如果我从代码(不是 fxml)为我的

wrapText
设置
MaxWidth
(甚至
PrefWidth
),标签的
VBox
可能不起作用。
可以帮助解决我的问题吗?如果你能说我怎样才能使文字换行,或者如果这是不可能的,这是javafx的问题,所以如果有任何想法可以实现我的目的,请说出来。
我很抱歉英语不好。谢谢。

java javafx
3个回答
4
投票

您需要为

prefWidth
本身设置
Label

这是一个简短的演示应用程序:

public class Main extends Application {

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

    @Override
    public void start(Stage primaryStage) {

        VBox root = new VBox(5);
        root.setPadding(new Insets(10));

        Label label = new Label("This is some long text that should be wrapped.");
        label.setWrapText(true);
        label.setPrefWidth(100);

        root.getChildren().add(label);

        primaryStage.setWidth(200);
        primaryStage.setHeight(200);

        primaryStage.setScene(new Scene(root));

        primaryStage.show();
    }
}

在您为

Label
设置首选宽度之前,它并不真正知道您要从哪里开始换行。

如果您希望标签以您的

VBox
的大小包裹,您可以将
PrefWidthProperty
Label
绑定到
WidthProperty
VBox

label.prefWidthProperty().bind(root.widthProperty());

这样做将使您的文本填充其容器的宽度,但如果太长则换行。


2
投票

将文本包装在 FXML 中名为

TextFlow
的内容中。它会帮你省去很多麻烦。


0
投票

对我有用的是:

label.setMinHeight(Region.USE_PREF_SIZE);
© www.soinside.com 2019 - 2024. All rights reserved.