我是新开发人员,我尝试制作一个程序。在我的程序中,有一个消息列表(
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
可能不起作用。您需要为
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());
这样做将使您的文本填充其容器的宽度,但如果太长则换行。
将文本包装在 FXML 中名为
TextFlow
的内容中。它会帮你省去很多麻烦。
对我有用的是:
label.setMinHeight(Region.USE_PREF_SIZE);