【问题标题】:How to automatically wrap JavaFX 2 ListView?如何自动包装 JavaFX 2 ListView?
【发布时间】:2012-12-13 21:45:34
【问题描述】:

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

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

【问题讨论】:

    标签: java listview javafx-2 multiline


    【解决方案1】:

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

    【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我发现这段代码在 JavaFX8 中产生了意想不到的行为。将if (!isEmpty) 稍微修改为if (empty || item == null) 适用于此版本。
    【解决方案3】:

    无需创建其他控件,例如 TextAreaText。只需setWrapText(true) 中的ListCell setPrefWidth(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 尊重它。

    【讨论】:

      猜你喜欢
      • 2019-04-28
      • 2012-04-26
      • 1970-01-01
      • 2013-01-08
      • 1970-01-01
      • 2017-06-18
      • 1970-01-01
      • 2020-04-09
      • 2013-04-20
      相关资源
      最近更新 更多