JavaFX 2でListView(テキストが長すぎる場合は複数行)を自動ラップするにはどうすればよいですか?文字列にaを付ける\n
と複数行になることはわかっていますが、内容が動的すぎます。
\n
または、すべてのxyz
ピクセル長の後に文字列に配置する良い方法はありますか?
ListCell.graphicProperty()にTextAreaを配置できます。これは通常、リストセルにアイコンを設定するために使用されますが、任意のノードサブクラスに設定するのと同じくらい簡単です。
これが私が最終的にそれをした方法の正確なコードです。
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()
}
}
}
ちなみに、これは私がキャメルケースの単語を正しくラップする方法です:
replace(Regex("(?<=\\p{javaLowerCase})(?=\\p{javaUpperCase})|(?<=[_.])"), "\u2028")
これは、 javaFX\u2028
が尊重するUnicodeのソフト改行文字です。