如何在JavaFX 2中创建自动换行ListView(文本太长时多行)?我知道如果我把\n
放到字符串中,它将是多行的,但内容太过动态了。
或者有一个很好的方法在每个\n
像素长度后将xyz
放到String中?
您可以将TextArea放在ListCell.graphicProperty()中。这通常用于在列表单元格中设置图标,但可以轻松设置为任何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)
和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尊重它。