【问题标题】:javaFx Label wrapText doesn't workjavaFx标签wrapText不起作用
【发布时间】:2018-06-17 18:53:06
【问题描述】:

我是新开发人员,我尝试制作一个程序。在我的程序中有一个消息列表(listMessages),其中的每条消息都是我创建的MessageItemController(自定义控件),其中包含一个VBox,其中包含一个标签和其他一些东西。 VBoxMessageItemController 中的 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 有一个最大宽度。之前,我为我的VBoxContent设置了一个MaxWidth,例如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)为我的 VBox 设置 MaxWidth(甚至是 PrefWidth),标签的 wrapText 可能不起作用。
有可能帮助我解决问题吗?如果你能说我怎样才能使文本换行,或者如果不可能,这是 javafx 的问题,所以如果有任何想法可以实现我的目的,请说出来。
我很抱歉英语不好。谢谢。

【问题讨论】:

    标签: java javafx


    【解决方案1】:

    您需要为Label 本身设置prefWidth

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

    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 的大小包装,您可以将 LabelPrefWidthProperty 绑定到 VBoxWidthProperty

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

    这样做可以让您的文本填满其容器的宽度,但如果太长则换行。

    【讨论】:

    • 感谢您的回答。起初我认为这不起作用,但它起作用了。谢谢
    【解决方案2】:

    将您的文本包装在您的 FXML 中一个名为 TextFlow 的东西中。它将为您省去很多麻烦。

    【讨论】:

    • 唯一对我有用的解决方案。我仍然必须添加label.setWrapText(true)label.prefWidthProperty().bind
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 2012-04-28
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多