【发布时间】:2012-12-13 21:45:34
【问题描述】:
如何在 JavaFX 2 中创建自动换行 ListView(文本太长时为多行)?我知道如果我把\n 放到字符串中,它会是多行的,但是内容太动态了。
或者有没有一种好方法可以在每个xyz 像素长度之后将\n 放入字符串?
【问题讨论】:
标签: java listview javafx-2 multiline
如何在 JavaFX 2 中创建自动换行 ListView(文本太长时为多行)?我知道如果我把\n 放到字符串中,它会是多行的,但是内容太动态了。
或者有没有一种好方法可以在每个xyz 像素长度之后将\n 放入字符串?
【问题讨论】:
标签: java listview javafx-2 multiline
您可以在 ListCell.graphicProperty() 中放置一个 TextArea。这通常用于在列表单元格中设置图标,但也可以轻松设置为任何 Node 子类。
【讨论】:
TextArea 上调用setEditable(false) 使其仅在需要时读取。
这是我最终如何做到的确切代码。
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;
}
});
【讨论】:
if (!isEmpty) 稍微修改为if (empty || item == null) 适用于此版本。
无需创建其他控件,例如 TextArea 或 Text。只需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 尊重它。
【讨论】: