3

如何在 JavaFX 2 中制作自动换行 ListView(文本太长时为多行)?我知道如果我把 a\n放到字符串中,它将是多行的,但内容太动态了。

或者有没有一种好方法可以在每个像素长度\n之后放入字符串?xyz

4

3 回答 3

5

您可以在 ListCell.graphicProperty() 中放置一个 TextArea。这通常用于在列表单元格中设置图标,但也可以轻松设置为任何 Node 子类。

于 2012-12-13T22:15:46.300 回答
4

这是我最终如何做到的确切代码。

    ListView<String> messages = new ListView<>();
    messages.relocate(10, 210);
    messages.setPrefSize(this.getPrefWidth() - 20, this.getPrefHeight() - 250);
    messages.setCellFactory(new Callback<ListView<String>, ListCell<String>>() {
        @Override
        public ListCell<String> call(ListView<String> list) {
            final ListCell cell = new ListCell() {
                private Text text;

                @Override
                public void updateItem(Object item, boolean empty) {
                    super.updateItem(item, empty);
                    if (!isEmpty()) {
                        text = new Text(item.toString());
                        text.setWrappingWidth(messages.getPrefWidth());
                        setGraphic(text);
                    }
                }
            };

            return cell;
        }
    });
于 2012-12-14T21:34:29.867 回答
1

无需创建额外的控件,例如TextAreaText仅此而已就足够setWrapText(true)了。它将在调整大小时自动重新包装。这是我在 Kotlin 中的工作代码:ListCell setPrefWidth(50.0)

    datasets.setCellFactory()
    {
        object : ListCell<Dataset>()
        {
            init
            {
                isWrapText = true
                prefWidth = 50.0
            }

            override fun updateItem(item: Dataset?, empty: Boolean)
            {
                super.updateItem(item, empty)

                text = item?.toString()
            }
        }
    }

顺便说一句,这就是我正确包装 CamelCase 单词的方法:

replace(Regex("(?<=\\p{javaLowerCase})(?=\\p{javaUpperCase})|(?<=[_.])"), "\u2028")

\u2028是 javaFX 尊重的 Unicode 软换行符。

于 2018-10-02T11:39:23.870 回答