如何在 JavaFX 2 中制作自动换行 ListView(文本太长时为多行)?我知道如果我把 a\n
放到字符串中,它将是多行的,但内容太动态了。
或者有没有一种好方法可以在每个像素长度\n
之后放入字符串?xyz
您可以在 ListCell.graphicProperty() 中放置一个 TextArea。这通常用于在列表单元格中设置图标,但也可以轻松设置为任何 Node 子类。
这是我最终如何做到的确切代码。
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;
}
});
无需创建额外的控件,例如TextArea
或Text
。仅此而已就足够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 软换行符。