有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java javaFx标签wrapText不起作用

我是一名新开发人员,我试图制作一个程序。在我的程序中有一个消息列表(listMessages),其中的每条消息都是我创建的一个MessageItemController(自定义控件),其中包含一个标签和一些其他内容。在MessageItemControllerVBox的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的问题,那么如果有任何想法来实现我的目的,请说出来
我很抱歉英语不好。谢谢


共 (2) 个答案

  1. # 1 楼答案

    在FXML中用一个名为TextFlow的东西包装文本。这会帮你省去很多麻烦

  2. # 2 楼答案

    您需要为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());
    

    这样做将允许文本填充其容器的宽度,但如果太长,则将其包裹