ホームページ >Java >&#&チュートリアル >JavaFX ListView でカスタム オブジェクト プロパティを表示するにはどうすればよいですか?
カスタム オブジェクトを使用して JavaFX で ListView にデータを設定する方法
課題は、文字列の代わりにカスタム オブジェクトを ListView に設定することにあります。各 Word に wordString と定義がある Word オブジェクトの observableArrayList を使用して、ListView に Word オブジェクト全体ではなく wordString を表示させたいと考えています。
カスタム ソリューション
1 つのアプローチには、セル ファクトリを使用して各セルの Word オブジェクトから wordString を取得することが含まれます。更新されたコード スニペットは次のとおりです:
<code class="java">listViewOfWords.setCellFactory(param -> new ListCell<Word>() { @Override protected void updateItem(Word item, boolean empty) { super.updateItem(item, empty); if (empty || item == null || item.getWord() == null) { setText(null); } else { setText(item.getWord()); } } });</code>
最適化された実装
1. UI プレゼンテーションの toString のオーバーライドを避ける
UI プレゼンテーションの toString をオーバーライドするのではなく、セル ファクトリを使用して UI 表現に適切なデータを抽出することを検討してください。これにより、UI プレゼンテーション ロジックがオブジェクトのテキスト表現から分離されます。
2.グラフィック ノードを使用したセルのカスタマイズ
セル ファクトリを使用すると、セルへのグラフィック ノードの追加など、より柔軟なカスタマイズが可能になります。以下に例を示します:
<code class="java">public static class WordListCell extends ListCell<Word> { private final Label title = new Label(); private final Label detail = new Label(); private final VBox layout = new VBox(title, detail); public WordListCell() { super(); title.setStyle("-fx-font-size: 20px;"); } @Override protected void updateItem(Word item, boolean empty) { super.updateItem(item, empty); setText(null); if (empty || item == null || item.getWord() == null) { title.setText(null); detail.setText(null); setGraphic(null); } else { title.setText(item.getWord()); detail.setText( item.getDefinition() != null ? item.getDefinition() : "Undefined" ); setGraphic(layout); } } }</code>
3.不変オブジェクトと監視可能なプロパティ
オブジェクトの意図しない変更を防ぐために、フィールド更新には不変の Word オブジェクトまたは監視可能なプロパティを持つオブジェクトを使用することをお勧めします。これにより、UI がプロパティの変更に応答できるようになります。
4.動的更新
基になる監視可能なリスト項目への変更 (追加、削除など) は、ビュー内の更新を自動的にトリガーします。オブジェクト内のプロパティの変更に応答するには、セル ファクトリにリスナー ロジックを実装するか、エクストラクターを使用する必要があります。エクストラクターは、監視可能なプロパティへの変更を通知するのに役立ちます。
エクストラクターを使用した例
<code class="java">ObservableList<Word> wordsList = FXCollections.observableArrayList(word -> new Observable[] { word.wordProperty(), word.definitionProperty() } );</code>
以上がJavaFX ListView でカスタム オブジェクト プロパティを表示するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。