我是新开发者,我尝试制作一个程序。在我的程序中有一个消息列表(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的问题所以如果有任何想法实现我的目的,请说出来。
我很抱歉英语不好。感谢。
答案 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
包裹文本。它将为您节省很多头痛。