プロジェクト

全般

プロフィール

JavaFXとリスト表示(ListView)

やりたいこと

オブジェクトのリストで表示される文字列をカスタマイズする

ListViewにString型以外のオブジェクトを適用した際、デフォルトではオブジェクトのtoString()が返す文字列が表示されます。
toString()は本来オブジェクトの内容を表現する文字列で主にデバッグ用に使い、ユーザーインターフェイス用の文字列を返すものではありません。
そこで、リスト表示で使う文字列を指定する別な実装をします。

ListCellのupdateItemをオーバーライドしたインスタンスを生成する式をListViewのsetCellFactoryにセット

ListView<Foo> fooListView;
    :
foolistView.setCellFactory(param -> new ListCell<>() {
    @Override
    protected void updateItem(Foo item, boolean empty) {
        super(item, empty);
        if (empty || item == null) {
            setText(null);
            setGraphic(null);
        } else {
            setText(item.getDisplayName());
        }
    }
});
  • emptyがtrueのときに、setText(null) と setGraphic(null) を呼ばないと、リスト表示にゴミが表示されることあり
  • Javadoc API の javafx.scene.control.CellクラスのupdateItemメソッド説明を参照

CheckBoxListCellでStringConverterを渡す

CheckBoxListCellを使うときは、ListViewのsetCellFactoryに、CheckBoxListCell.forListView の2引数バージョンで第2引数にStringConverterを指定してリスト表示文字列を生成します。

ListView<Foo> fooListView;
    :
foolistView.setCellFactory(CheckBoxListCell.forListView(
    item -> item.getNode().visibileProperty(),
    new StringConverter<>() {
        @Override
        public String toString(Foo item) {
            return item.getDisplayName();
        }
        @Override
        public Foo fromString(String name) {
            return null; // don't call from ListView
        }
    }
);


ほぼ5年前に更新