Hiho、javafx内の個々のListViewアイテムをリフレッシュする
ListViewを「きれいに」更新するのに問題があります。それはプレイリストの項目の束を持つプレイリストです。基本的には、アイテムのスタイルやコンテンツが変更されたときに、ListViewで変更する必要があります。現在、リスト全体がリフレッシュされていますが、それは私の思うように機能しますが、私にとって本当に貧しい(不明瞭な)解決策のように思えます(そして、それはちらつきます)。特定のアイテムを更新/再描画する方法はありますか?私は何かを見つけることができませんでした。参考のため
次のことが発生したときに、各項目を更新する必要があります:
- 項目に関連したファイルを読み込み、それが失敗例えばされています。またはメタデータが取り出される。
- または、ユーザ入力から、例えば現在の曲を変更するときなどである。
何とかリスナーを使用できますか?私はバインディングなどを見てきましたが、私が探しているものが見つからないようです。すべてのヘルプは大幅に再び
編集を感謝:
以下の作業のコードをリストを初期化:工場で作成された
protected Playlist(List<PlaylistItem> list){
...
// initialise the items
backup = FXCollections.observableArrayList(list);
setItems(backup);
// Use a custom CellFactory
setCellFactory(new Callback<ListView<PlaylistItem>, ListCell<PlaylistItem>>() {
@Override
public ListCell<PlaylistItem> call(ListView<PlaylistItem> list) {
return new PlaylistCell();
}
});
...
}
細胞:
private class PlaylistCell extends ListCell<PlaylistItem> {
private PlaylistItem lastItem = null;
private final BooleanProperty booleanProperty = new SimpleBooleanProperty(false);
/** Add a listener to the boolean property upon construction */
private PlaylistCell() {
booleanProperty.addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
if (newValue) { updateItem(lastItem, lastItem == null); };
}
});
}
@Override
public void updateItem(PlaylistItem item, boolean empty) {
super.updateItem(item, empty);
booleanProperty.set(false);
if (lastItem != item){
// remove the pointer if we change item
if (lastItem != null && booleanProperty == lastItem.getBooleanProperty())
lastItem.setBooleanProperty(null);
// and attach it to the new item
if (item != null)
item.setBooleanProperty(booleanProperty);
}
// redraw the cell
if (!empty && item != null) {
lastItem = item;
// current song in bold
if (item.equals(current)) {
setId("current-item");
} else{
setId(null);
}
// mark queued songs & update text
if (queue.contains(item)) {
int i = queue.indexOf(item);
super.setText(item.toString() + "\t (" + (i + 1) + (i != queue.lastIndexOf(item) ? ", ...)": ')'));
} else {
super.setText(item.toString());
}
}
// draw an empty cell
else {
lastItem = null;
setText(null);
setId(null);
}
}
}
そして私例えばダブル現在のアイテムをクリックするか、アイテムをキューに入れると、BooleanPropertyをtrue(つまり変更されている)に設定して、更新呼び出しをトリガーします。 queue
を想定し
何をしているのかを示すコードを投稿できますか?具体的には、リスト内の項目が[JavaFXプロパティ](http://www.oracle.com/pls/topic/lookup?ctx=javase80&id=JFXBD107)を使用している場合は、[extractor] (http://stackoverflow.com/questions/23822550/listview-is-not-reflecting-changes)。 –
James_D:いくつかのコードを追加しました。私はStringPropertyをすばやく使ってみましたが、わかっている限り、各項目に対して1つのリスナーが必要なので、単純すぎるほど複雑すぎるようでした。私はリストから検索することもできるので、どちらかの方法でエクストラクタを見ていきます。ありがとう – user6502063
あなたがしていることを理解するのに十分なコードはありません。しかし、私が言ったように、あなたはextractorで 'ObservableList'を使うべきです(前のコメントのAPI docsへのリンクを見てください)。 http://stackoverflow.com/questions/23822550/listview-is-not-reflecting-changes –