2016-12-01 17 views
0

状態に応じてテーブルの行を色付けしたいと思います。検索後、私はこれを見つけたFormatting Rows in a JavaFX TableView Using CSS Pseudo ClassesJavafxテーブルビューの変更リストが頻繁に変更されます

私の目的のために実装しようとしました。それも動作しますが、スクロールすると色はデフォルトのものに戻ります。
何が間違っていますか?

@FXML 
private void initialize(){ 

    PseudoClass online = PseudoClass.getPseudoClass("online"); 
    PseudoClass offline = PseudoClass.getPseudoClass("offline"); 
    PseudoClass unknown = PseudoClass.getPseudoClass("unknown"); 

    //Set a rowFactory for the table view. 
    overviewTable.setRowFactory(tableView -> { 
      TableRow<State> row = new TableRow<>(); 
      ChangeListener<String> changeListener = (obs, oldValue, newValue) -> { 
       System.out.println("1: " + obs + " : " + oldValue + " : " + newValue); 
       row.pseudoClassStateChanged(online, newValue.equals("online")); 
       row.pseudoClassStateChanged(offline, newValue.equals("offline")); 
       row.pseudoClassStateChanged(unknown, newValue.equals("unknown")); 
      }; 

      row.itemProperty().addListener((obs, oldValue, newValue) -> { 
       System.out.println("2: " + obs + " : " + oldValue + " : " + newValue); 
       if (oldValue != null) { 
        oldValue.stateProperty().removeListener(changeListener); 
       } 
       if (newValue != null) { 
        newValue.stateProperty().addListener(changeListener); 
        row.pseudoClassStateChanged(online, newValue.equals("online")); 
        row.pseudoClassStateChanged(offline, newValue.equals("offline")); 
        row.pseudoClassStateChanged(unknown, newValue.equals("unknown")); 
       } else { 
        row.pseudoClassStateChanged(online, false); 
        row.pseudoClassStateChanged(offline, false); 
        row.pseudoClassStateChanged(unknown, false); 
       } 
      }); 
      return row; 
     }); 
} 

CSS:

.table-row-cell:unknown{ 
-fx-background-color: blue; 
} 

.table-row-cell:online{ 
-fx-background-color: #2EAB15; 
} 

.table-row-cell:offline{ 
-fx-background-color: #BB0000; 
} 

.table-row-cell .text{ 
-fx-fill: white; 
} 
+0

"スクロールすると色がデフォルトのものに戻ります。"これはどういう意味ですか?擬似クラスは変更されていますか(IE:あなたはsysoを取得していますか?)疑似クラスはまだ同じですが、色はちょうど変化していますか? – Ironcache

答えて

1

問題がitemプロパティにリスナーに右ここにある:ここで

if (newValue != null) { 
    newValue.stateProperty().addListener(changeListener); 
    row.pseudoClassStateChanged(online, newValue.equals("online")); 
    row.pseudoClassStateChanged(offline, newValue.equals("offline")); 
    row.pseudoClassStateChanged(unknown, newValue.equals("unknown")); 

newValueはタイプStateの目的です。 Stringが渡された場合、がtrueを返すようにオーバーライドされる可能性は低いです(このような方法ではequalsを実装しないことをおすすめします)。

stateプロパティの値が変更されたかのように、あなたは代わりに、更新をトリガするリスナーに新しい値を渡す必要があります。

if (newValue != null) { 
    newValue.stateProperty().addListener(changeListener); 
    changeListener.changed(null, null, newValue.getState()); 

または代わりにかかわらず、DRY原則に違反しstateプロパティ(と比較します):

if (newValue != null) { 
    newValue.stateProperty().addListener(changeListener); 
    row.pseudoClassStateChanged(online, newValue.getState().equals("online")); 
    row.pseudoClassStateChanged(offline, newValue.getState().equals("offline")); 
    row.pseudoClassStateChanged(unknown, newValue.getState().equals("unknown")); 

私はここに仮定StateクラスがgetState()メソッドが含まれていることstateプロパティの内容を返します。そうでない場合、そのメソッドへのすべての呼び出しをstateProperty().getValue()に置き換える必要があります。

+0

ありがとうございました。期待どおりに動作する – Ronon

関連する問題