ホームページ >Java >&#&チュートリアル >JavaFX ListView でカスタム オブジェクト プロパティを表示するにはどうすればよいですか?

JavaFX ListView でカスタム オブジェクト プロパティを表示するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-25 00:25:02468ブラウズ

How Can I Display Custom Object Properties in a 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。