2017-07-12 9 views
0

私はオブジェクトの対応するファイルが存在するかどうかを示すBooleanプロパティを有する:ファイルが削除または追加された場合、この値は、別のスレッドによって更新されバインドテーブルビューの行の背景色

public Track { 
    BooleanProperty fileIsMissing = new SimpleBooleanProperty (false); 
    ... 
    public BooleanProperty fileIsMissingProperty() { 
     return fileIsMissing; 
    } 

    public boolean isMissingFile() { 
     return fileIsMissing.getValue(); 
    } 
    ... 
} 

を。

トラックを行に表示するTableViewがあります。

BooleanPropertyが変更されたときに、行の背景の色を変更したいと思います。trueの場合は、背景が赤色になりたい場合はfalseです通常の色です。

私はほとんど機能し、以下、持っている:

trackTable.setRowFactory(tv -> { 
    TableRow <CurrentListTrack> row = new TableRow <>(); 

    row.itemProperty().addListener((obs, oldValue, newValue) -> { 
     if (newValue.isMissingFile()) { 
      row.getStyleClass().add("file-missing"); 
     } else { 
      row.getStyleClass().removeAll(Collections.singleton("file-missing")); 
     } 
    }); 

    ... 
} 

とCSSでの:

.file-missing { 
    -fx-control-inner-background: palevioletred; 
} 

トラックが最初のテーブルに追加されたとき、これは、適切な背景を設定しますが、それはdoesnのfileIsMissingの値が更新されると、私はプロパティにバインドしていないので、意味があります。

どうすればこの問題を解決できますか?

答えて

2

あなたもfileIsMissingプロパティを聞く必要があります。

現在のリスナーは、追加された新しいトラックレコードに反応します。ネストされたリスナーは、トラックの変更に反応します。あなたはリストでのremoveAllむしろlist.remove(オブジェクト)を使用することができる1つのリスト要素を削除するには、BTW

row.itemProperty().addListener((obs, oldValue, newTrackValue) -> { 
    if (newTrackValue != null) { 
     newTrackValue.fileIsMissingProperty().addListener((o, old, newValue) -> { 
     if (newValue) { 
      row.getStyleClass().add("file-missing"); 
     } else { 
      row.getStyleClass().remove("file-missing"); 
     } 
    } 
}); 

はこのようなものになる可能性があります。

+0

それはトリックでした、ありがとう! – JoshuaD