3

単純なXMLファイルである.nfoファイルを生成するための単純なアプリケーションを開発しています。だから私はこのようなアプリケーションを持っています

NFOメーカーアプリケーション

TreeViewには型パラメーターが必要なので、ツリーの単純なモデルを作成しました。このモデルはXMLモデルをカプセル化します。これは、これらがリーフであり、ノードではないためです。

私の問題

写真では、左側にツリーが表示され、右側にxml(ツリーリーフ)で編集されるプロパティが表示されます。これらのプロパティ(現在はtitlePropertyのみ)をバインドすると、すべて正常に機能します。ただし、テキストフィールドで何かを変更しても、TreeViewは更新されません。TreeItemをダブルクリックする必要があります。

エディターパネルの変更を反映するようにTreeViewを更新するにはどうすればよいですか?

コードはGitHubにあります

4

1 に答える 1

2

これは、updateItemメソッドが呼び出されるのは、TreeCellのアイテムが変更された場合ではなく、置き換えられた場合のみであるためだと思います。必要なのは、アイテムのプロパティが変更されたことをTreeCellインスタンスに通知する方法です。

たとえば、ツリーセルのテキストを変更するためにメソッドsetTextを使用する代わりに、textPropertyをモデルオブジェクトの必要なプロパティにバインドしてみてください。もちろん、JavaFXプロパティとバインディングを使用するためにモデルを更新する必要があります。別の解決策は、古いスタイルのPropertyChangeListenerを使用することです。

例が必要な場合は、提供を試みることができます。

編集:ちょっとした例。エピソードリーフのテキストを変更しました。もちろん、EpsiodeDetailsクラスのエピソードとタイトルのプロパティをjavafxスタイルのプロパティに移動する必要があります。

@Override
protected void updateItem(ITVShowItem item, boolean empty) {
    super.updateItem(item, empty);
    if (item != null) {
        if (item instanceof Show) {
            //nothing
        } else if (item instanceof Season) {
            Season season = (Season) item;
            setText("Season " + season.getSeason());
        } else if (item instanceof Episode) {
            Episode episode = (Episode) item;
            this.textProperty().bind(Bindings.concat(episode.getDetails().episodeProperty(), " - ", episode.getDetails().titleProperty()));
            //setText(episode.getDetails().getEpisode() + " - " + episode.getDetails().getTitle());
        }
    }
}
于 2012-07-25T07:09:38.150 に答える