如何自动包装JavaFX 2 ListView?

问题描述 投票:3回答:3

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

或者有一个很好的方法在每个\n像素长度后将xyz放到String中?

java listview javafx-2 multiline
3个回答
5
投票

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


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;
        }
    });

1
投票

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

    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是Unicode软线中断字符,javaFX尊重它。

© www.soinside.com 2019 - 2024. All rights reserved.