javaFx标签wrapText不起作用

时间:2018-06-17 18:53:06

标签: java javafx

我是新开发者,我尝试制作一个程序。在我的程序中有一个消息列表(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具有最大宽度。之前,我为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的问题所以如果有任何想法实现我的目的,请说出来。
我很抱歉英语不好。感谢。

2 个答案:

答案 0 :(得分:1)

您需要为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的{​​{1}}绑定到Label的{​​{1}}而不是:

WidthProperty

执行此操作将允许您的文本填充其容器的宽度,但如果它太长则会换行。

答案 1 :(得分:0)

在FXML中用TextFlow包裹文本。它将为您节省很多头痛。