2016-12-01 10 views
0

상태에 따라 테이블의 행에 색을 지정하고 싶습니다. 수색 후에 나는 이것을 Formatting Rows in a JavaFX TableView Using CSS Pseudo Classes이라고 발견했습니다.Javafx tableview changelistener가 자주 변경됨

제 목적으로 구현하려고했습니다. 또한 작동하지만 스크롤하면 기본 색상으로 다시 변경됩니다.
무엇이 잘못 되었나요?

@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 속성 값이 변경 것처럼 당신은 대신 업데이 트를 트리거하기 위해 리스너에 대한 새 값을 전달한다 : 비록 DRY 원칙을 위반 state 특성 (비교 양자 택일

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

또는) :

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